Назад | Перейти на главную страницу

массово mv с помощью find?

есть куча файлов filename.gif, разбросанных по каталогам / home /. Я хочу, чтобы все filename.gif были заменены на /home/shared/filename_default.gif.

Я пробовал что-то вроде

find /home/ -name "filename.gif" | xargs <cmd>

но я понятия не имею, что я хочу упомянуть. Не обязательно спрашивать об этом здесь или stackoverflow

Изменить: это работает точно так же, как я объяснил, за исключением того, что я не только хотел, чтобы данные из filename_default заменяли filename.gif, но и для filename.gif было переименовано filename_default.gif. Так я и сделал mv {} filename_default.gif и переместил все файлы из их каталогов в / root / под именем filename_default.gif ... lol. есть ли способ ссылаться на изменяющуюся переменную в каталоге ..

например, find / home / -name "filename.gif" на самом деле был расположен вот так ...

/home/brian/dir/1/2/3/filename.gif
/home/beth/dir/1/2/3/filename.gif
/home/andrea/dir/1/2/3/filename.gif

Как я могу ссылаться на brian, beth, andrea ... как на подстановочный знак *.

cp /home/shared/filename_default.gif /home/*/dir/1/2/3/filename_default.gif
find /home -name filename.gif -type f -printf "%h\0" | xargs -0 --max-args 1 cp -l  /home/shared/filename_default.gif

Это не подстановочный знак, который вы просили, но он выполняет первую часть вашей задачи, а именно: "filename_default.gif"в целевых каталогах. Если это работает так, как вы хотите, вы можете заменить 'cp -l /home/shared/filename_default.gif'часть команды с'rm'и заменить'-printf "%h\0"' с участием '-print0', чтобы удалить исходный файл.

Это предполагает, что вы хотите взять содержимое /home/shared/filename_default.gif и поместите это содержимое в файл с именем 'filename_default.gif'во всех каталогах, содержащих'filename.gif', удаление'filename.gif'(и, таким образом, эффективно заменяя'filename.gif'именованные файлы с идентичным изображением в файле с именем'filename_default.gif')

Если вы хотите заменить 'filename.gif'но оставьте имя прежним, затем замените'-printf "%h\0"' с участием '-print0'и опустить rm шаг.

Как насчет этого?

find /home/ -name filename.gif -exec mv -f /home/shared/filename_default.gif {} \;

Флаг -exec заставляет find выполнять команду для каждого найденного объекта. В {} указывает имя найденного файла. Затем вам нужно завершить команду оболочки с помощью \;. Возможно, вы могли бы использовать ln -s для символической ссылки на эти .gif-файлы. Это может быть проще, если вы когда-нибудь захотите изменить свой общий .gif без повторения такого рода поиска и перемещения.

РЕДАКТИРОВАТЬ Ниже приведены положительные моменты Денилсона. Несмотря на вопрос, связанный с mv, он сработает только один раз, прежде чем исходный файл исчезнет. (перемещено) Его совет по команде echo - хороший способ дважды проверить, что произойдет, прежде чем это произойдет.

find /home/ -name filename.gif -exec cp -p /home/shared/filename_default.gif {} \;


- Кристофер Карел

# find -type f -name 'filename.gif' -exec cp -v /home/shared/filename_default.gif {} \;

Это заменит все ваши файлы "filename.gif" содержимым "filename_default.gif", но не переименует "filename.gif" в "filename_default.gif"

Для переименования используйте следующую команду

# rename 's/filename.gif/filename_default.gif/' $(find -type f -name 'filename.gif')

HTH