He creado el siguiente script que mueve los archivos de antaño tal como se define desde el directorio de origen al directorio de destino. Funciona perfectamente
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
Este script mueve muy bien los archivos, también mueve archivos del subdirectorio de origen, pero no crea el subdirectorio en el directorio de destino. Quiero implementar esta característica adicional en él.
con ejemplo
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
Cuando ejecuto este script, también mueve los archivos hexadecimales en el directorio maxi, pero necesito que ese mismo hex se cree en el directorio maxi y mueva sus archivos allí en el mismo hex.
fuente
for x do
, tienes una falta;
allí :). Además, no tengo idea de lo que querías lograr,$0
pero estoy bastante convencido de que seríash
:).for x; do
técnicamente no es compatible con POSIX (verifique la gramática ), pero los shells modernos permiten ambosfor x do
yfor x; do
; algunas viejas conchas de Bourne no se quejaronfor x; do
. En las conchas modernas, consh -c '…' arg0 arg1 arg2 arg3
, searg0
convierte$0
, searg1
convierte$1
, etc. Si quieres$0
sersh
, necesitas escribirsh -c '…' sh arg1 arg2 arg3
. Nuevamente, algunos shells Bourne se comportaron de manera diferente, pero POSIX lo especifica.pushd
Parece una mejor opción quecd
, ya que es menos intrusivo en el entorno actual.Sé que
find
fue especificado, pero esto suena como un trabajo pararsync
.A menudo uso lo siguiente:
Aquí hay un buen ejemplo si solo desea mover archivos de un tipo de archivo en particular ( ejemplo ):
fuente
--remove-source-files
fue útil, lo que efectivamente hace que los archivos se muevan en lugar de copiarse. Este es un uso impresionante de rsync.puedes hacerlo usando dos instancias de find (1)
Siempre hay cpio (1)
Verifique los argumentos para cpio. Los que di
fuente
No es tan eficiente, pero el código es más fácil de leer y entender, en mi opinión, si solo copia los archivos y luego los elimina.
Aviso: Falla descubierta por @MV para operaciones automatizadas:
fuente
Puede hacer esto agregando la ruta absoluta del archivo devuelto
find
a su ruta de destino:fuente
$destination
contiene caracteres especiales, ya que se expande en el caparazón interno. Quizás quisiste decirdestination='\'"$destination"\''
? Eso todavía se rompe'
. Además, esto crea archivos como en/home/maxi/home/ketan/hex/foo
lugar de/home/maxi/hex/foo
.Mejor (más rápido y sin consumir espacio de almacenamiento haciendo copia en lugar de mover), tampoco se ve afectado por los nombres de archivo si contienen caracteres especiales en sus nombres:
O más rápido, moviendo un montón de archivos al mismo tiempo para múltiples CPU, usando el comando "paralelo":
PD: Tienes un error tipográfico, "soure" debería ser "fuente". Mantuve el nombre de la variable.
fuente
Esto es menos elegante pero fácil si el número / tamaño de los archivos no es demasiado grande
Comprima sus archivos en un
zip
archivo y luego descomprímalos en el destino sin la-j
opción. Por defecto, zip creará la estructura de directorios relativa.fuente
Intenta de esta manera:
fuente
Debido a que parece que no hay una solución realmente fácil para esto y la necesito muy a menudo, creé esta utilidad de código abierto para Linux (requiere Python): https://github.com/benapetr/smv
Hay varias formas de usarlo para lograr lo que necesita, pero probablemente la más simple sería algo como esto:
También puede ejecutarlo en modo seco para que no haga nada más que imprimir lo que haría
O en caso de que esa lista de archivos sea demasiado larga para caber en la línea de argumento y no le importe ejecutar Python para cada archivo, entonces
fuente