Tengo un directorio foo
con subdirectorios. Deseo crear los mismos nombres de subdirectorios en otro directorio sin copiar su contenido. ¿Cómo hago esto?
¿Hay alguna manera de obtener ls
resultados como una lista de expansión de llaves?
Prueba esto,
cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
. -type d
Para enumerar directorios en la ruta actual de forma recursiva.mkdir -p -- /destination/directory/{}
crear directorio en el destino. Esto se basa en una find
que admite la expansión {}
en el medio de una palabra de argumento.
find
admiten la interpolación{}
en otra cadena./source/dir/path
, entonces este puede fallar con una "lista de argumentos demasiado tiempo" cuando los intentos de concha para llamarfind
a la expansión de*
. Es mejor usarlo.
allí. Además, la mayoría de lasfind
implementaciones permiten{}
su uso incluso cuando se concatenan con otra cadena, pero no es universal..
lugar de*
en este caso. (El uso de xarg para el rendimiento y la seguridad probablemente requeriría un script externo para la concatenación de ruta)Utilizando
rsync
:Esto recrearía la estructura de directorios
/some/path/dir
comodir
en el directorio actual, sin copiar ningún archivo.Cualquier directorio encontrado en la ruta de origen se crearía en el destino debido al patrón de inclusión, pero se excluiría cualquier otra cosa. Como efecto secundario del uso de
-a
(--archive
), obtendrá las mismas marcas de tiempo en todos los subdirectorios en el destino que en la fuente. Esto también funciona para crear estructuras de directorios locales a partir de directorios remotos (y viceversa).fuente
rsync
!Puede usar
find
para recorrer la estructura de origen y llamarmkdir
a cada directorio que encuentre.Este ejemplo, usando
find
, copiará la estructura de su directorio defoo
a/tmp/another/
El
exec
bucle crea el conjunto de directorios debajofoo
, que luego se pasa almkdir
. Si no tiene una versiónfind
que comprenda+
, puede usarla\;
a costa de la eficiencia. Sustitúyalomkdir
porecho mkdir
para ver qué sucedería sin hacerlo realmente.fuente
... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’
(aunque sí funciona-exec ... \;
)/path/to/{}
pero ahora no puedo encontrar ninguna versión donde funcione, así que he adaptado la solución. GraciasCon el shell bash, puede solicitarle la expansión de cada directorio con la
globstar
opción:y luego copie los directorios con un bucle:
... o si pensabas que todos encajarían dentro de una llamada para
mkdir
:Esa es la sintaxis de la matriz bash que dice: "tome todos los elementos de la
$@
matriz y reemplace el comienzo de cada uno de ellos/path/to/dest/
.No conozco una forma de obtener
ls
resultados directamente como una lista de expansión de llaves. Si trató de masajear la salida de la**/
expansión en una expansión de llave, necesitaría tener cuidado de:{
o${
secuenciaNo lo recomendaría
fuente
La pregunta es un duplicado entre sitios de /superuser/1389580/copy-directory-structure-only-at-year-end
Este tipo de tarea es un caso de uso clásico para
mtree
:Lo anterior crea todos los directorios
new-tree
que estaban presentes enold-tree
.mtree
Sin embargo, no establece marcas de tiempo en los directorios recién creados, por lo que el árbol resultante se ve así:Si prefiere que las
new-tree
marcas de tiempo coincidanold-tree
, simplementemtree
vuelva a ejecutar . Como los directorios ya existen,mtree
modificará las marcas de tiempo para que coincidan con la especificación de origen:fuente