Respuestas:
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
):
#!/bin/bash
mv "$1" "$2"
ln -s "$2" "$1"
Ejemplo de uso:
./test.sh asdf otherdir/asdf
Tenga en cuenta que esto no realiza controles de seguridad, etc. Dependiendo de cuán compleja sea su tarea, esto podría ser suficiente.
./test.sh .mozila/firefox/zotero/*/*.pdf MyBbliography/*.pdf
. El *
no parece estar trabajando con su test.sh
. ¿Tienes una solución? Thx
Generalmente uso la función de una línea:
function ml() { mkdir -p "$(dirname "$1")" && rsync -aP --no-links "$1" "$2" && ln -sf "$2" "$1" }
El uso es similar a mv o cp:
ml old_file target_dir/new_file_name
Desglosándolo:
mkdir -p "$(dirname "$1")"
- crea el directorio de destino si aún no existe
dirname "$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 con mv "$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 antiguo