2013-09-30 50 views
5

我試圖從某個目錄中的所有文件中刪除特定單詞列表,並將其替換爲空白。從文件名中刪除單詞列表

所以:

這真棒內容的720p BLAH FOO BANG OOO - 30.9.2013.mp4

變爲:

這真棒內容 - 30.9.2013.mp4

現在下面的工程對單翅d並替換一個詞。

find path/to/folder/ -maxdepth 3 -name '*.*' -execdir bash -c 'mv -i "$1" "${1//foo/}"' bash {} \; 

我也嘗試了多次發現,但這似乎是一個很長的做法,我似乎遇到這樣的問題。

幾個問題,我有:

  • 希望它是不區分大小寫
  • 極品「$ {1個//富/}」來指代一個列表,如果大於
  • 刪除空格1

試圖在cronjob上將其作爲bash腳本運行。

除非有更好的方法來刪除「This Awesome Content」 - 「30.9.2013.mp4」之間的所有內容。

非常感謝。

回答

4

您可以使用'echo'命令將文件的名稱作爲變量來訪問。完成之後,進行所需更改的最有效方法是使用'sed'。您可以使用'-e'標誌將sed命令串起來。作爲bash for循環的一部分,這一行爲您提供了一個開始。你也可以使用這樣的一行來作爲你的'find'語句的一部分。

echo $fyle | sed -e 's/FOO//gI' -e 's/BANG//gI' 

一旦你有你想要的文件名,你可以將它們移回原來的名稱。讓我知道你是否需要更具體的指示。

更新:這是一個更完整的解決方案。你必須調整腳本到您自己的文件名等

for fyle in $(find . -name "*.*") 
do 
    mv -i $fyle `echo $fyle | sed -e 's/FOO//gI' -e 's/BANG//gI' ` 
done 

最後,用一個空格字符替換多個空格字符,你可以添加其他sed命令。這是一個工作指令:

echo "file input.txt" | sed 's/ */ /g' 
+0

似乎我是一個完整的newb。我將如何實現這個到我的find命令中,替換mv命令?另外如果我把我加到-e's/FOO // g',例如-e'/ FOO // Ig'會忽略大小寫敏感性。 – Keelan

+1

要使sed不區分大小寫,請在末尾添加gI。我更新了我的帖子。 – philshem

+1

我已經添加了更完整的解決方案。請讓我知道它是如何爲你工作的。 – philshem

3

一種方式做,這將增加在那裏你生成mv命令的文件來實現這一目標的一箇中間步驟,然後執行該文件。我假設你有一個文件包含你不想要的單詞。

cd文件夾開始

# Create list of valid <file>s in file_list, and list of "mv <file> " commmands 
# in cmd_file 
ls | grep -f words_file | tee file_list | sed 's/\(.*\)/mv "\1" /g' > cmd_file 

# Create the sed statements using the words_file, store it to sed_commands 
# Then, apply the sed commands to file_list 
sed 's/\(.*\)/s\/\1\/\/g/g' words_file > sed_commands 
sed -f sed_commands file_list > new_file_names 

# Combine cmd_file and new_file_names to produce the full mv statements 
paste cmd_file new_file_names > final_cmds 

# To verify the commands 
cat final_cmds 

# Finally, execute it 
sh final_cmds 

之前,這是我能想出的,它避免了手工編寫sed -e每個字。不知道是否有更簡單的方法使用常用的bash實用程序。當然,您可以使用perl或python並更簡潔地編寫它。

編輯:簡化它,取消了eval和xargs。

+0

看起來不錯,我如何指定一個文件夾? – Keelan

+0

當我運行這個「$ sed's /\(.*\)/ s \/\ 1 \/\/g'words_file> sed_commands」時出現錯誤----錯誤是: sed:-e expression #1,char 19:未終止's'命令 –

+0

@Keelan在開始之前cd到目錄。 –

1

A 該任務的腳本。它接受至少有兩個參數,第一個是單詞從文件名稱中刪除列表,剩下的都是要處理的文件:

perl -MFile::Spec -MFile::Copy -e ' 
    $words = join(q{|}, split(q| |, shift)); 
    $words_re = qr{$words}i; 
    for $path (@ARGV) { 
     ($dummy, $dir, $f) = File::Spec->splitpath($path); 
     $f =~ s/$words_re//g; 
     $f =~ s/\s{2,}/ /g; 
     $newpath = File::Spec->catfile($dir, $f); 
     move($path, $newpath); 
     printf qq|[[%s]] renamed to [[%s]]\n|, $path, $newpath; 
    } 
' "720p BLAH FOO BANG OOO" tmp/user/*.mp4 

在我的測試我下面的輸出:

[[tmp/user/This Awesome Content 720p BLAH FOO BANG OOO - 30.9.2013.mp4]] renamed to [[tmp/user/This Awesome Content - 30.9.2013.mp4]] 
+0

我根本不知道perl,所以我認爲這可能超出了我的境界。我可以指定一個目錄來搜索文件嗎? – Keelan

+1

@Keelan:是的。但是然後使用替代命令是很危險的,因爲可以修改部分路徑。它需要修復才能使用模塊。 – Birei

+0

噢好吧,我想我會保持清醒。 Perl嚇壞了我。 – Keelan

0

prename可用於文件重命名部分。 stg類似的:

find ... -exec prename 's/(deleteme1|deleteme2|…)//g' {} \;