[英]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 {} \;
我也嘗試了多個發現,但這似乎是一個很長的方式,我似乎遇到問題這樣。
我有幾個問題:
試圖在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腳本。 它至少接受兩個參數,第一個是要從文件名中刪除的單詞列表,其余的是要處理的文件:
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.