使用特定模式复制文件

use*_*112 1 shell-script

我正在尝试将文件从一个位置复制到另一个位置,下面给出了一些示例:

aaa_bbb_ccc_ddd_cost_code_20140330.gz
aaa_bbb_ccc_ddd_revenue_zone_20140329.gz
aaa_bbb_ccc_ddd_benefit_extract_20140330.csv.gz
aaa_bbb_ccc_ddd_profit_zone_20150509.csv.gz
aaa_bbb_ccc_ddd_loss_zone_20140330.csv
aaa_bbb_ccc_ddd_username.csv.gz
Run Code Online (Sandbox Code Playgroud)

从上面的列表中,应该复制的文件应该是以下格式:

aaa_bbb_ccc_ddd_cost[or]revenue[or]benefit[or]profit[or]loss_yyyymmdd.csv.gz
Run Code Online (Sandbox Code Playgroud)

这意味着文件

aaa_bbb_ccc_ddd_loss_zone_20140330.csv
aaa_bbb_ccc_ddd_username.csv.gz
Run Code Online (Sandbox Code Playgroud)

不应该被复制。

另外,我需要将它分配给一个变量,我正在尝试这样的事情,但它似乎不起作用:

FILENAME="egrep 'aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit)_code_[0-9]{8}.csv.gz'"
Run Code Online (Sandbox Code Playgroud)

我试图将它分配给一个变量的原因是因为我需要稍后在代码中使用它来做这样的事情:

SOURCE_DIR="/temp"
DESTN_DIR="/output"
FILENAME=`egrep 'aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit)_code_[0-9]{8}.csv.gz'`
echo "FILENAME is:" $FILENAME
for SAMPLE_FILE in $(ls "$SOURCE_DIR/$FILENAME")
do
cp $SAMPLE_FILE $DESTN_DIR
done
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以实现这一目标?

Joh*_*024 5

使用find及其-exec选项(此处使用 GNUfind作为-regex谓词):

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

笔记:

  • find .告诉find从当前目录开始查找文件。

  • 默认情况下,GNUfind使用 emacs 风格的正则表达式。我更喜欢,-regextype posix-egrep但您可以切换到您熟悉的任何受支持的样式。

  • 正则表达式用于选择文件:-regex '.*/aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit|loss)_[[:alpha:]]+_[0-9]+\.csv\.gz'. 这允许使用标准前缀 ofaaa_bbb_ccc_ddd_后跟由 指定的单词之一(cost|revenue|benefit|profit|loss),然后是另一个未指定的单词_[[:alpha:]]+,然后是日期_[0-9]+,然后是所需的扩展名.csv.gz。您可能需要对此进行微调。

  • 找到的任何此类文件都将通过-exec mv {} "$DESTN_DIR" \;. 当find找到匹配的文件时,它执行此命令替换{}文件名。即使文件名有空格、换行符或其他困难字符,这也能工作。

使用正则表达式的默认 (emacs) 样式

GNU 的默认正则表达式样式find需要对分组和交替运算符进行一些转义:

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

Mac OSX

Mac OSX 版本find此处的手册页)支持-regex但不支持-regextype. 不过,如果它的正则表达式语法需要一些细微的变化,我不会感到惊讶。

IBM AIX 5

为的IBM AIX版本的手册页find这里。它是不会支持-regex