Используя find для переименования каталога в мусорный каталог

OS / X поставляется с zsh , поэтому вместо этого вы можете написать свой сценарий в zsh (обратите внимание, что вы уже использовали zsh ] (поскольку ваш $ i не цитируется, что вызывает оператор split + glob в bash ):

for x in {00..06}; do
  echo $x
done

Posixly, вы всегда можете сделать:

x=0; while [ "$x" -le 6 ]; do
  printf '%02d\n' "$x"
  x=$((x + 1))
done

или

seq() (first=$1 last=$2 width=${3:-0} step=${4:-1}
  awk "BEGIN{for (i = $first; i <= $last; i += $step)
    printf \"%0${width}d\n\", i}"
)

unset -v IFS # make sure we get the default separator
             # for the split+glob invocation below
for i in $(seq 0 6 2); do
  echo "$i"
done
0
17.06.2018, 18:10
1 ответ

Sí, findfunciona con nombres de rutas, no con nombres de archivos.

Hay dos soluciones inmediatas:

  1. Puede extraer la parte del nombre de archivo de la ruta y usarla en la ruta de destino utilizada por mv.

    find /Users/myname/Desktop/backups/websites/testwebsite.co.uk \
        -maxdepth 1 -type d -mtime +1 \
        -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' \
        -exec sh -c 'mv "$1" "/Users/myname/Desktop/backups/trash/${1##*/}_renamed"' sh {} ';'
    

    Aquí, ${1##*/}es lo mismo que $( basename "$1" ), y $1es el nombre de ruta dado al script sh -cpor find.

  2. Podría usar -execdiren lugar de -execsi su implementación findlo admite. Con -execdir, el comando dado se ejecuta en la carpeta principal del elemento encontrado, y {}será el nombre base del elemento (con BSDfind)o el nombre base con el prefijo./(con GNUfind)​​.

    find /Users/myname/Desktop/backups/websites/testwebsite.co.uk \
        -maxdepth 1 -type d -mtime +1 \
        -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' \
        -execdir mv {} /Users/myname/Desktop/backups/trash/{}_renamed ';'
    

Relacionado:

2
28.01.2020, 02:31

Теги

Похожие вопросы