Найдите файлы и переименуйте и переместитесь в другой каталог

Когда я выполняю команду

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

Может любой помогать мне.

1
задан 15 February 2020 в 16:51

2 ответа

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, который мы использовали, чтобы пробный прогон протестировал.

0
ответ дан 20 February 2020 в 22:53

{} заменяется всем путем файла, поскольку Вы видите его при выполнении команды без -exec часть. Так, очевидно, Вы не можете непосредственно использовать это. Можно использовать basename управляйте для лишения только имени файла пути, как в

find dir_1 -type f -name '*.txt' -exec sh -c 'mv "{}" ../dir2/new_$(basename "{}")' \;

Добавление кавычек " вокруг {} будет иметь это работой также, если имя файла будет содержать пробелы.

0
ответ дан 20 February 2020 в 22:53

Другие вопросы по тегам:

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