问题:在目录中,我有以下格式的文件:
<account-number>-<invoice-number>, an example being:
123456-3456789
123456-6789023
123456-2568907
...
456789-2347890
456789-2344357
etc.
我想要做的是,如果同一帐户有超过1张发票,请删除除最新帐户以外的所有帐户。如果只有一个,请不要管它。
感谢您的任何指示。
答案 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
乍一看可能处于陌生的地方
但是没关系,每次迭代都会再次执行(但只读取第一行)