У меня есть папка с именем, /home/user/temps
которая имеет 487 папок. В каждой папке у меня есть файл с именем thumb.png.
Я хочу скопировать все файлы с именем thumb.png в отдельную папку и переименовать их в соответствии с папкой, из которой они пришли.
Ответы:
Ну вот:
редактировать:
Кстати, каноническая мудрость заключается в том, что использовать
find
для этого плохая идея - просто использование расширения оболочки гораздо надежнее. Кроме того, это предполагаетbash
, но я думаю, что это безопасное предположение :)редактировать 2:
для ясности я разобью это
подробности о
${var/Pattern/Replacement}
конструкции можно найти здесь .кавычки в
cp
строке важны для обработки пробелов, новых строк и т. д. в именах файлов.источник
new_file/\/thumb
?${VARIABLE/PATTTERN/REPLACEMENT}
выдает значениеVARIABLE
но с заменой шаблона на текст замены. Здесь шаблон/thumb
(/
необходимо экранировать, чтобы он не выглядел${new_file//PATTERN/REPLACEMENT}
, что делает его глобальной заменой вместо замены первого появления), а текст замены пуст./home/user/temps
, что не ясно из вопроса. Если это не так, вам нужно найти или**
.Это работает для сколь угодно глубоких подкаталогов:
Интересная часть - расширение параметров
${NAME//\//_}
. Он принимает содержаниеNAME
, и заменяет все вхождения/
с_
.Примечание: результат зависит от рабочего каталога и параметра пути для поиска. Я выполнил команду из родительского каталога временных файлов. Заменить
cp
сecho
экспериментом.источник
Краткий вспомогательный код:
давайте назовем его «deslash.sh» и сделаем его исполняемым. Позвоните с помощью:
Это не удастся, если столкновение существует
но это неизбежно.
источник
Попробуй это
редактировать
Я добавил кавычки на случай, если в любом из ваших имен dir есть пробелы.
Также я изменил это, так что он будет только распечатывать команды, которые будут выполнены. Проверьте выходные данные скрипта, чтобы убедиться, что все имена файлов / путей выглядят правильно. Если вы уверены, что нет проблем с командами, которые будут выполнены, удалите
echo
.источник
mv -i ./A A/thumb.png ../tmp/.png
- все файлы заканчиваются на ../tmp/.png (../tmp - это мой целевой каталог).find -type d
и увидеть результат. Это получает все каталоги, которые вы ожидаете? Если нет, пожалуйста, добавьте вывод, чтобы показать проблему. Удачи.read dir
выполняет разбиение слов и извлекает из каталоговa\nb
a и b как два экземпляра, которые не может решить ни одна маскировка.Для копирования вам нужна команда cp , а переименование для linux - это то же самое, что и перемещение файла, поэтому вы должны сделать это с помощью команды mv . В Linux вы всегда должны указывать весь путь, от источника, если вы находитесь в другой папке, и, конечно, до папки назначения. Я бы что-то вроде этого, для копирования:
или переименовать или переместить
источник
find