我有以下命令:
find . -mtime -5 -type f -exec ls -ltr {} \; | awk '{print "cp -p "$9" "$7}'
输出如下:
cp -p ./18587_96xxdata.txt 10
cp -p ./16947_96xxdata.txt 8
cp -p ./32721_96xxdata.txt 9
cp -p ./32343_96xxdata.txt 9
cp -p ./32984_96xxdata.txt 10
但我希望输出的最后部分始终为 2 位数字,例如:
cp -p ./18587_96xxdata.txt 10
cp -p ./16947_96xxdata.txt 08
cp -p ./32721_96xxdata.txt 09
cp -p ./32343_96xxdata.txt 09
cp -p ./32984_96xxdata.txt 10
我尝试了不同的变体%02d
,但没有得到我想要的。
这是我尝试过的一个:
find . -mtime -5 -type f -exec ls -ltr {} \; | awk '{print "cp -p " $9 " "("%02d", $7)}'
我应该使用 吗printf
?如果是,具体如何使用?
谢谢你!
答案1
看https://mywiki.wooledge.org/ParsingLs和https://mywiki.wooledge.org/Quotes然后这样做:
$ find . -mtime -5 -type f -printf "cp -p '%p' '%Ad'\n"
cp -p './bbbb.csv' '09'
cp -p './cccc.csv' '10'
cp -p './out1.txt' '09'
cp -p './out2.txt' '05'
答案2
是的,printf
是你的朋友。用于%.2d
将数字用 0 填充为 2 位:
find . -mtime -5 -type f -exec ls -ltr {} \; |
awk '{printf "cp -p %s %.2d\n", $9, $7}'
为了说明这一点,我在包含原始输出的文件上运行了以下命令:
$ cat file
cp -p ./18587_96xxdata.txt 10
cp -p ./16947_96xxdata.txt 8
cp -p ./32721_96xxdata.txt 9
cp -p ./32343_96xxdata.txt 9
cp -p ./32984_96xxdata.txt 10
$ awk '{printf "%.2d\n", $NF}' file
10
08
09
09
10
请注意非常好的一点由@edmorton提出。解析 ls 非常脆弱。埃德的解决方案要好得多。