簡體   English   中英

awk 更新目錄中的文件名

[英]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

有許多基本問題。

  1. 通過將 *.txt 傳遞給 awk - awk 將逐行打開目錄中的每個 .txt 文件。 相反,您只想處理目錄列表(所以我添加了 ls *.txt )。
  2. 必須使用 awk 的 -v 選項設置變量 var。
  3. 您不需要引用“$5”和“var”。 我懷疑你在你的問題中粘貼了一些舊代碼,因為你已經開始工作了。
  4. - 的字段分隔符不足。 您將丟失文件名的“_x1_y.txt”和“_x2_y.txt”部分。 我添加了下划線作為額外的字段分隔符。

作為調試技巧,您可以在執行任何操作之前查看 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM