¿Alguien puede darme una orden que:
- mover un archivo hacia un nuevo directorio
- y dejar un enlace simbólico en su ubicación anterior hacia la nueva
fuente
¿Alguien puede darme una orden que:
mv
mueve un archivo y ln -s
crea un enlace simbólico, por lo que la tarea básica se lleva a cabo mediante un script que ejecuta estos dos comandos:
#!/bin/sh
mv -- "$1" "$2"
ln -s -- "$2" "$1"
Hay algunas advertencias. Si el segundo argumento es un directorio, mv
movería el archivo a ese directorio, pero ln -s
crearía un enlace al directorio en lugar de al archivo movido.
#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
target="$target/${original##*/}"
fi
mv -- "$original" "$target"
ln -s -- "$target" "$original"
Otra advertencia es que el primer argumento ln -s
es el texto exacto del enlace simbólico. Es relativo a la ubicación del objetivo, no al directorio donde se ejecuta el comando. Si la ubicación original no está en el directorio actual y el destino no se expresa mediante una ruta absoluta, el enlace será incorrecto. En este caso, la ruta debe reescribirse. En este caso, crearé un enlace absoluto (sería preferible un enlace relativo, pero es más difícil hacerlo bien). Este script supone que no tiene nombres de archivo que terminen en un carácter de nueva línea.
#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
target="$target/${original##*/}"
fi
mv -- "$original" "$target"
case "$original" in
*/*)
case "$target" in
/*) :;;
*) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
esac
esac
ln -s -- "$target" "$original"
Si tiene varios archivos, procéselos en un bucle.
#!/bin/sh
while [ $# -gt 1 ]; do
eval "target=\${$#}"
original="$1"
if [ -d "$target" ]; then
target="$target/${original##*/}"
fi
mv -- "$original" "$target"
case "$original" in
*/*)
case "$target" in
/*) :;;
*) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
esac
esac
ln -s -- "$target" "$original"
shift
done
rsync --remove-source-files
podría ser más informativo para los usuarios que están moviendo un archivo grande de un disco, lo que puede llevar algo de tiempo.Pon esto en el archivo .sh y hazlo ejecutable (
chmod +x filename
):Ejemplo de uso:
Tenga en cuenta que esto no realiza controles de seguridad, etc. Dependiendo de cuán compleja sea su tarea, esto podría ser suficiente.
fuente
./test.sh .mozila/firefox/zotero/*/*.pdf MyBbliography/*.pdf
. El*
no parece estar trabajando con sutest.sh
. ¿Tienes una solución? ThxGeneralmente uso la función de una línea:
El uso es similar a mv o cp:
Desglosándolo:
mkdir -p "$(dirname "$1")"
- crea el directorio de destino si aún no existedirname "$1"
- obtenga el componente de directorio de la ruta (elimine el nombre del archivo)rsync -aP --no-links "$1" "$2"
- Copie el archivo al destino. Reemplace esto conmv "$1" "$2"
si ambos archivos están en el mismo sistema de archivos para un mejor rendimiento.-a
- preservar la propiedad y todos los demás permisos. Puede ajustar esto para preservar solo los componentes que desee.-P
- Mostrar progreso.--no-links
- no copie enlaces: esto significa que puede ejecutar este comando tantas veces como desee en el mismo archivo, y nunca perderá su archivo al sobrescribir accidentalmente su archivo de destino con un enlace simbólico a sí mismo.ln -sf "$2" "$1"
- sobrescribe el archivo anterior con un enlace simbólico al archivo nuevo-s
- usar enlaces simbólicos-f
- sobrescribe el archivo antiguofuente