Переместить файлы определенного типа и переименовать с тем же именем

pstree обеспечивает хороший форматированный вывод, показывающий, что породило что (при условии, что родитель не умирает сразу после порождения команды gzip)

Также посмотрите Есть ли простой способ вести журнал всех выполненных команд, включая аргументы командной строки?

1
04.01.2019, 20:49
1 ответ

Реализация GNU cpимеет параметр --backup=[CONTROL], который создает файлы с другими именами, если целевой файл уже существует. Формат немного уродлив, так как он использует символы тильды ('~')для разделения расширения резервной копии.

Полезным CONTROLаргументом в вашем случае может бытьnumbered:

find. -name '*.zip' -exec cp --backup=numbered '{}' '/path/to/outputdir' \;

Обратите внимание: поскольку я не знаю ни одной такой опции для mv, если вы выберете этот подход, позже вам придется удалить исходные файлы на отдельном шаге.

Одна проблема, которую я вижу в этом решении, заключается в том, что будет невозможно отличить, какой файл из какого каталога. РЕДАКТИРОВАТЬ :Хотя некоторые люди считают такое поведение уместным и является поведением браузеров по умолчанию, например, когда вы загружаете файлы с одним и тем же именем -в один и тот же каталог несколько раз. Хотя расширение имени файла для этих «резервных копий» в этом случае другое, оно также пронумеровано.

Вместо описанного выше вы также можете встроить путь в каждое имя файла, например, заменив косую черту разделителями на символы подчеркивания. Хотя результаты более информативны, вы можете получить очень длинные и некрасивые имена файлов, и есть много места для ошибок :

.

find. -name '*.zip' | while read filePath; do cp "$filePath" '/path/to/outputdir'/"$(echo "$filePath" | sed -e 's#^\\.##' -e 's#/#_#g')"; done

Кроме того, файлы, в которых на самом деле были символы подчеркивания, будут выглядеть странно, и это может быть двусмысленным, если компонент имени файла, разделенный символом подчеркивания, ранее был компонентом имени пути или нет.

Обратите внимание, что символ косой черты между '/path/to/outputdir'и командой, начинающейся с "$(echo "$filePath" |..., чрезвычайно важен!

Первое выражение sedпредназначено для того, чтобы избежать создания скрытых файлов, если вершина дерева поиска, указанная в find, начинается с символа точки. Второй - это просто замена косой черты разделителя пути символом подчеркивания.

Решение также не очень масштабируемо, так как вам, возможно, придется внести много изменений, если вы просто хотите изменить findзапрос, чтобы избежать резких результатов. Например,если запрос findтакже включает каталоги, cpне будет обрабатывать эти строки. К счастью, в этом случае копирование просто не удается, и вы даже получаете сообщение в свой поток ошибок. Перезапись файлов в вашей файловой системе — это не шутки!

0
28.01.2020, 00:21

Теги

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