[英]awk to update filename in directory
在下面,我嘗試使用awk
更改目錄中一對文件名(在連字符和下划線之間)的一部分,並將值存儲在變量中。 下面確實執行,但文件名不會改變。 謝謝 :)。
多變的
id=aaaaa
目錄中的文件
00-0000-xxx-y-zzz_x1_y.txt
00-0000-xxx-y-zzz_x2_y.txt
想要的
00-0000-xxx-y-aaaaa_x1_y.txt
00-0000-xxx-y-aaaaa_x2_y.txt
awk
awk -F'-' var=$id'{sub("$5","var")}1' *.txt
您能否嘗試以下(使用純 bash 解決方案),以下將遍歷所有.txt
文件,並且僅在終端上打印重命名命令。 如果您對終端上顯示的結果感到滿意,請附加| bash
| bash
到解決方案。 注意,請在運行以下命令之前設置id=aaaaa
。
for file in *.txt
do
echo "mv $file ${file%-*}-${id}_${file#*_}"
done
一旦您對上述結果感到滿意,然后運行以下命令將文件實際重命名為新文件。
for file in *.txt
do
echo "mv $file ${file%-*}-${id}_${file#*_}"
done | bash
awk
正在更改文件內容,而不是文件名本身。
除了 awk,您還可以使用rename
perl 實用程序,如下所示:
id='aaaaa'
rename -n "s/^(.*)-[^_]+_/\$1-${id}_/" *.txt
'00-0000-xxx-y-zzz_x1_y.txt' would be renamed to '00-0000-xxx-y-aaaaa_x1_y.txt'
您可以讓 awk 為您創建 bash 命令,然后將 awk 的輸出通過管道傳輸到 bash。
ls *.txt | awk -F'[_-]' -vvar=$id '{f=$0 ; sub($5,var); print "mv", f, $0 } ' | bash
有許多基本問題。
作為調試技巧,您可以在執行任何操作之前查看 awk 將要執行的操作:
$ ls *.txt | awk -F'[_-]' -vvar=$id '{f=$0 ; sub($5,var); print "mv", f, $0 } '
mv 00-0000-xxx-y-zzz_x1_y.txt 00-0000-xxx-y-aaaaa_x1_y.txt
mv 00-0000-xxx-y-zzz_x2_y.txt 00-0000-xxx-y-aaaaa_x2_y.txt
如果以上看起來不錯,只需將輸出通過管道傳輸到 bash(如我提供的第一個代碼)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.