Копирование файлов с определенным шаблоном

[115175] Хотя я нахожу ваш вопрос очень подозрительным, ответ будет:[12144]Который найдет все файлы, заканчивающиеся на [115609]. html[115610], которые последний раз изменялись в любой понедельник в истории человечества, в соответствии с текущим часовым поясом, установленным на сервере.[115178].
1
21.05.2014, 09:55
5 ответов
[1172983]
1
27.01.2020, 23:11
[1173167] С [1173609]zsh[1173610]:

ksh93 узоры могут выразить это с

и [1173611]ksh88[1173612] с:

Однако [1173613] расширенные [1173614] глобусные операторы не работают внутри переменных, чтобы избежать нарушения совместимости с POSIX:

- неправильный синтаксис согласно POSIX, поэтому [1173615]ksh[1173616] может сделать его новым глобусным оператором. Однако:

  • полностью указана для POSIX и предназначена для вывода [1173617]@(a)[1173618] (со значением IFS по умолчанию), а не [1173619]a[1173620], если в текущем каталоге есть файл с именем [1173621]a[1173622].
  • Таким образом, вам придется прибегнуть к использованию [1173623]eval[1173624], что может быть хитроумно, чтобы получить правильное

3
27.01.2020, 23:11
[1173245] Любая современная оболочка поддерживает то, что вы хотите напрямую, не с помощью базового синтаксиса глобуса, а вот так:

enter image description here

Это разбивается на пять аргументов, каждый из которых представляет собой глобус вида [1173713]..._ключевое слово_....

  1. Итак, чтобы ответить на второй вопрос, вот как по очереди присвоить каждый из них переменной:
  2. Проверка существования ([1173715] if [ -e $FNAME ][1173716]) заключается в том, что если любой из пяти глобусов ни с чем не сравнится, глобус будет сохранен как есть, и вы получите сообщение об ошибке.[1173252].
1
27.01.2020, 23:11

Это можно сделать одной строкой:

find /temp -maxdepth 1 -type f | \
 grep -P 'aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit)_.*[0-9]{8}' | \
 xargs cp -t /output
  • find перечисляет содержимое папки без подпапок.
  • grep ваши имена файлов
  • и скопируйте ( cp ) их из целевого каталога ( -t )

Вам просто нужно скорректировать ваше регулярное выражение, потому что в вашем вопросе не было 100% ясности. Некоторые файлы имеют .csv.gz , некоторые .csv и некоторые .gz .

1
27.01.2020, 23:11

Используйте find и его опцию -exec (здесь используется GNU find для предиката -regex):

find . -regextype posix-egrep -regex '.*/aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit|loss)_[[:alpha:]]+_[0-9]+\.csv\.gz' -exec mv {} "$DESTN_DIR" \;

Примечание:

  • find . указывает find искать файлы, начинающиеся в текущем каталоге.

  • По умолчанию GNU find использует регулярные выражения в стиле emacs. Я предпочитаю -regextype posix-egrep, но вы можете перейти на любой из поддерживаемых стилей, с которыми вы знакомы.

  • Для выбора файлов используется регулярное выражение: -regex '.*/aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit|loss)_[[:alpha:]]+_[0-9]+\.csv\.gz'. Это позволяет использовать стандартный префикс aaa_bbb_ccc_ddd_, за которым следует одно из слов, указанных (cost|revenue|benefit|profit|loss), за которым следует другое неопределенное слово, _[[[:alpha:]]+, за которым следует дата, _[0-9]+, за которым следует желаемое расширение . csv.gz. Возможно, вы захотите уточнить это.

  • Все найденные файлы будут перемещены в целевой каталог с помощью команды -exec mv {} "$DESTN_DIR" \;. Когда find находит подходящий файл, он выполняет эту команду, заменяя {} именем файла. Это сработает, даже если в именах файлов есть пробелы, новые строки или другие сложные символы.

Использование стиля регулярных выражений по умолчанию (emacs)

Стиль regex по умолчанию для GNU find требует некоторого экранирования операторов группировки и чередования:

find . -regex '.*/aaa_bbb_ccc_ddd_\(cost\|revenue\|benefit\|profit\|loss\)_[[:alpha:]]+_[0-9]+\.csv\.gz' -exec echo mv {} targetdir \;

Mac OSX

Версия find для Mac OSX (man page here) поддерживает -regex, но не -regextype. Однако я не удивлюсь, если синтаксис regex потребует некоторых тонких изменений.

IBM AIX 5

Страница руководства для версии find для IBM AIX находится здесь. Она не поддерживает -regex.

5
27.01.2020, 23:11

Теги

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