Когда я выполняю команду
find dir_1 -type f -name 'f*'
Я нашел 2 файла там "file_11" и "file_22". Теперь я хочу переместить те файлы в другое использование каталога "dir_2" - должностное лицо с командой "находки". Таким образом, я использую эту команду.
find dir_1 -type f -name 'f*' -exec mv {} ../dir2 \;
Эта команда работы.
Теперь, в каталоге "dir_1" существуют также некоторые ".txt" файлы. Я хочу переместить эти текстовые файлы в "dir2" и также переименовать эти файлы. таким образом, я использую эту команду,
find dir_1 -type f -name '*.txt' -exec mv {} ../dir2/new_{} \;
Но я получаю ошибку,
mv: cannot move 'dir_1/file1.txt' to '../dir2/new_dir_1/file1.txt': No such file or directory
mv: cannot move 'dir_1/file2.txt' to '../dir2/new_dir_1/file2.txt': No such file or directory
Может любой помогать мне.
find dir_1 -type f -name '*.txt' -exec \
sh -c 'echo mv "$1" "/path/to/dir_2/new_${1##*/}"' sh_mv {} \;
синтаксис ${parameter##word}
расширение параметра оболочки. и cuts-up-to-last-prefix указан словом от его данного параметра; здесь это разделяет часть пути от имени файла. так ./dir_1/sub_directory/file1.txt
становится справедливым file1.txt
и позже добавил new_
к имени файла.
sh -c '...'
конструкция известна как встроенная оболочка (здесь sh
оболочка) и мы открываем его для обеспечивания/создавания необходимых параметров для mv
управляйте для перемещения &rename и использования его функции расширения параметра для этого.
с sh -c '...' sh_mv {}
, это принимает два аргумента, каждый sh_mv
(используемый в качестве маркировки для встроенной оболочки мы открываемся (параметр $0
)); {}
аргументом будет замена имени файла, найденного find
управляйте и передаст как следующий аргумент (параметр $1
).
примечание: удалить echo
выполнить фактический mv, который мы использовали, чтобы пробный прогон протестировал.
{}
заменяется всем путем файла, поскольку Вы видите его при выполнении команды без -exec
часть. Так, очевидно, Вы не можете непосредственно использовать это. Можно использовать basename
управляйте для лишения только имени файла пути, как в
find dir_1 -type f -name '*.txt' -exec sh -c 'mv "{}" ../dir2/new_$(basename "{}")' \;
Добавление кавычек "
вокруг {}
будет иметь это работой также, если имя файла будет содержать пробелы.