bash脚本模式匹配和删除文件

时间:2013-11-19 17:57:30

标签: bash shell

问题:在目录中,我有以下格式的文件:

<account-number>-<invoice-number>, an example being:

123456-3456789
123456-6789023
123456-2568907
...
456789-2347890
456789-2344357

etc.

我想要做的是,如果同一帐户有超过1张发票,请删除除最新帐户以外的所有帐户。如果只有一个,请不要管它。

感谢您的任何指示。

3 个答案:

答案 0 :(得分:0)

您可以使用此基于awk的脚本:

mkdir _tmp
ls -rt *-*|awk -F'-' '{a[$1]=$0} END{for (i in a) system("mv " a[i] " _tmp/")}'

./_tmp/中的文件感到满意后,从当前目录中删除所有文件并移动文件。

答案 1 :(得分:0)

以下是纯粹的bash解决方案(验证时将echo替换为rm

for file1 in *-*
do 
    IFS=- arr=($file1)
    for file2 in "${arr[0]}"*
    do 
        [ "$file1" -nt "$file2" ] && echo "$file2"
    done
done

答案 2 :(得分:0)

Bash中的一个好人:
(伪“就地”处理)

#!/bin/bash -e

ADIR="/path/to/account/directory"
TMP="$ADIR.tmp"

mkdir "$TMP" && rmdir "$TMP" && mv "$ADIR" "$TMP" && mkdir "$ADIR"

while IFS=- read ACCNT INVOICE < <( ls -t1 "$TMP" )
do
    mv "$TMP/$ACCNT-$INVOICE" "$ADIR/$ACCNT-$INVOICE" && rm "$TMP/$ACCNT"*
done

rmdir "$ADIR.tmp"

它的作用:

1首先将a(ccounts)目录移动到临时目录。 (是原子的)
 2循环:列出最新发票,将其移至新目录,删除同一帐户的发票  3删除临时目录

<强>优点: 坚固,安全,简短,合理快速,并在严重错误时停止

<强>缺点: 非常明确,请务必始终备份

<强>注释:
您可能已经注意到mkdir "$TMP" && rmdir "$TMP"
这是故意的:rmdir为“dir not exists”提供相同的返回值,因为“dir not empty” 所以不要检查两者中的哪一个 [ -d $DIRNAME ] && { rmdir $DIRNAME || exit } 我使用了上面的结构。

ls -t1 "$TMP乍一看可能处于陌生的地方 但是没关系,每次迭代都会再次执行(但只读取第一行)