есть куча файлов 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