Bash
如何使用 sed 和 csv 重命名文件
我是 Linux 新手,
sed
但awk
我不介意挑戰自己的新想法。話雖如此,我了解目的和如何使用rename
以及sed
用於常見事件,例如從所有文件中添加$date
或刪除 a 。_1234
但是,我想弄清楚如何重命名 100 個除了文件類型之外彼此沒有關係的文件。重命名範例:
- 舊名稱 alpha.ai 重命名為 omega.ai
- 舊名稱 pie32.ai 重命名為 apple.ai
- 舊名稱 xmas.ai 重命名為 santa.ai
我最初使用 bash 腳本將所有名稱拉到 .csv 文件中,並將它們放在 A 列中。在 BI 列中寫入新名稱。現在,既然沒有發生共同事件,你怎麼能寫
sed
或類似的東西呢?#!/bin/bash for i in *.ai do mv $i $(echo $i | sed "a1,b1") done
如果您碰巧有一個如下所示的文件:
old_name1, new_name1 old_name2, new_name2 old_name3, new_name3
你可以做一個骯髒的小把戲:
sed 's/^/mv -vi "/;s/, /" "/;s/$/";/' < names.csv | bash -
sed 命令(由分號分隔)執行此操作(
s
用於替代,/
用作分隔符,任何其他字元都可以,@
也經常使用):
s/^/mv -vi "/
-mv -vi "
在每行的開頭添加(^
是行的開頭);s/, /" "/``" "
- 用;替換逗號後跟一個空格s/$/";/
- 將雙引號附加到所有行($
表示行尾)因此輸出
sed
將是這樣的:mv -vi "old_name1" "new_name1" mv -vi "old_name2" "new_name2" mv -vi "old_name3" "new_name3"
這將被送去
bash
執行。文件名周圍的引號不是強制性的,它們只是保護文件名中任何可能的空格(但是它們肯定不會幫助防止空格後跟逗號,因為它被用作分隔符)。-v
指示mv
顯示它正在做什麼(如果出現問題,你會知道發生了什麼),將-i
導致它詢問它是否要覆蓋已經存在的文件。