ksh93 узоры могут выразить это с
и [1173611]ksh88[1173612] с:
Однако [1173613] расширенные [1173614] глобусные операторы не работают внутри переменных, чтобы избежать нарушения совместимости с POSIX:
- неправильный синтаксис согласно POSIX, поэтому [1173615]ksh[1173616] может сделать его новым глобусным оператором. Однако:
Это разбивается на пять аргументов, каждый из которых представляет собой глобус вида [1173713]..._ключевое слово_
Это можно сделать одной строкой:
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
.
Используйте 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
находит подходящий файл, он выполняет эту команду, заменяя {}
именем файла. Это сработает, даже если в именах файлов есть пробелы, новые строки или другие сложные символы.
Стиль regex по умолчанию для GNU find
требует некоторого экранирования операторов группировки и чередования:
find . -regex '.*/aaa_bbb_ccc_ddd_\(cost\|revenue\|benefit\|profit\|loss\)_[[:alpha:]]+_[0-9]+\.csv\.gz' -exec echo mv {} targetdir \;
Версия find
для Mac OSX (man page here) поддерживает -regex
, но не -regextype
. Однако я не удивлюсь, если синтаксис regex потребует некоторых тонких изменений.
Страница руководства для версии find
для IBM AIX находится здесь. Она не поддерживает -regex
.