簡體   English   中英

從文件名中刪除單詞列表

[英]Remove a list of words from filename

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

所以:

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

變為:

這個很棒的內容 - 30.9.2013.mp4

現在,以下內容適用於單個查找並替換一個單詞。

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

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

我有幾個問題:

  • 希望它不區分大小寫
  • 需要“$ {1 // foo /}”來引用列表
  • 如果大於1,請刪除空格

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

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

非常感激。

您可以使用'echo'命令將文件名稱作為變量訪問。 完成后,進行所需更改的最有效方法是使用“sed”。 您可以使用'-e'標志將sed命令串在一起。 作為bash中for循環的一部分,這一行為您提供了一個開始。 您也可以使用這樣的行作為“查找”語句的一部分。

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'

一種方法是添加一個中間步驟,您可以使用mv命令生成一個文件來實現此目的,然后執行該文件。 我假設你有一個包含你不想要的單詞的words_file文件。

在開始之前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。

任務的腳本。 它至少接受兩個參數,第一個是要從文件名中刪除的單詞列表,其余的是要處理的文件:

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

prename對文件重命名部分很有用。 類似的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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