Bash

如何使用 sed 和 csv 重命名文件

  • December 30, 2014

我是 Linux 新手,sedawk我不介意挑戰自己的新想法。話雖如此,我了解目的和如何使用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導致它詢問它是否要覆蓋已經存在的文件。

引用自:https://unix.stackexchange.com/questions/57754