find命令不能在名称中使用冒号

时间:2016-10-23 11:31:43

标签: linux bash shell find

我将包含mp3 / m4a文件的很多文件夹复制到我的NAS-music-dir(ext3),没有任何问题。一些foldernames包含':' (冒号),多个点(...)等。如何通过删除冒号和其他不需要的字符来使用find-command重命名文件夹?每个简单的find-command都会给出一个错误:

cd /nas3/Musik
find . -type d -exec grep -H ':' '{}' \+
find: "./Eis_Am_Stiel_Volume_3:_Liebeleien--The_Shirelles": Datei oder Verzeichnis nicht gefunden
find: "./Kicking_Television:_Live_In_Chicago--Wilco": Datei oder Verzeichnis nicht gefunden
find: "./Respect:_A_Century_Of_Women_In_Music--Mary_Wells": Datei oder Verzeichnis nicht gefunden

...

德语术语" Datei oder Verzeichnis nicht gefunden"意味着"无法找到文件或文件夹"。

我该如何解决这个问题? 很多!

3 个答案:

答案 0 :(得分:1)

find . -type d -exec grep -H ':' '{}' \+

这个命令对我来说很奇怪。我经常使用相同的构造,但从不引用大括号或转义+。但是,最大的问题是你想要grep目录的原因。

也许你打算这样做呢?

find . -type d -name \*:\*

或者

find . -type d | grep ':' 

答案 1 :(得分:1)

<强>命令:

find . -regextype egrep -iregex '.*\:.*'

<强>替代:

find . -iname "*:*"

<强>结果:

./Eis_Am_Stiel_Volume_3:_Liebeleien--The_Shirelles
./Kicking_Television:_Live_In_Chicago--Wilco
./Respect:_A_Century_Of_Women_In_Music--Mary_Wells

<强>注释:

  • 使用find(或在管道中抛出任何文件名)时,使用 &#34; 的做法&lt; ---引用---&gt; &#34; 围绕任何标识符/变量/反向引用/字符串通常会更有帮助。

    < / LI>
  • 如果由于某种原因你确实需要对从find发出的文件名采取行动,那么使用空分隔符会更加安全:

示例

find . -iname "*:*" -print0 | while IFS= read -rd '' file ; do echo "$file" ; done

将与以下相同:

find . -iname "*:*" -print | while read -r file ; do echo "$file" ; done

但第一个例子更安全:

  • 使用-print0会导致输出 null 分隔的文件,而不是分隔的文件。如果一些奇怪命名的文件(特别是从下载中提取的文件/转换不良/其他文件)包含换行符,当非战略性地放置在管道中时,你会感到惊讶,这真的非常非常糟糕。

  • while IFS=(但没有命令分隔符),设置该命令的IFS。因此,如果此环境变化发生变化,您将不会感到惊讶

  • while IFS= read -rd '' var基本上是&#34;读&#34;赞美print0 - 如果输出空分隔符,则还必须读取空分隔符。

答案 2 :(得分:0)

非常感谢bjorn和hek2mgl。 (抱歉延误!)

我改为工作目录并尝试了所有6个版本:

命令行脚本 - 版本1到版本6

find . -type d -name \*:\* # V1
find . -type d | grep ':' #V2
find . -regextype egrep -iregex '.*\:.*' #V3
find . -iname "*:*" #V4
find . -iname "*:*" -print0 | while IFS= read -rd '' file ; do echo "$file" ; done #V5
find . -iname "*:*" -print | while read -r file ; do echo "$file" ; done #V6

输出V1,V2(部分)

...
./Booom_2005:_The_First--E-Rotic
./Bravo:_The_Hits_2000--Alannah_Myles
./Booom_2006:_The_First--Curse
find: "./Gold:_Greatest_Hits--Boney_M.": Datei oder Verzeichnis nicht gefunden
./Black_Coffee_Chapter_1:_Ambientfunk_a_Mellowmoves--Aromabar
./Beethoven:_Fate--South_German_Philharmonic_Orchestra
./Bravo:_The_Hits_2002_Part_2--Kelly_Osbourne
...

V3,V4,V5,V6的输出(部分)

...
./Booom_2005:_The_First--E-Rotic
./Bravo:_The_Hits_2000--Alannah_Myles
./Booom_2006:_The_First--Curse
./Gold:_Greatest_Hits--Boney_M.
./Black_Coffee_Chapter_1:_Ambientfunk_a_Mellowmoves--Aromabar
./Beethoven:_Fate--South_German_Philharmonic_Orchestra
./Bravo:_The_Hits_2002_Part_2--Kelly_Osbourne
...

正如您可以看到V1和V2的输出中的1个不同的线(不那么重要)。让我们继续吧 4个命令行脚本 - 首先基于版本3,5,6,1

find . -regextype egrep -iregex '.*\:.*' |while read -r line; do new=$(echo "$line"|tr -d ':'); echo "$line" --- "$new";mv "$line" "$new"; done #V3
find . -iname "*:*" -print0 |while IFS= read -rd '' line ; do new=$(echo "$line"|tr -d ':'); echo "$line" --- "$new"; mv "$line" "$new" ; done #V5
find . -iname "*:*" -print |while read -r line ; do new=$(echo "$line"|tr -d ':'); echo "$line" --- "$new"; mv "$line" "$new"; done #V6
find . -type d -name \*:\*|while read -r line ; do new=$(echo "$line"|tr -d ':'); echo "$line" --- "$new"; mv "$line" "$new"; done #V1

V3,V5,V6,V1(部分)的输出

...
./Booom_2005:_The_First--E-Rotic --- ./Booom_2005_The_First--E-Rotic
mv: das Verschieben von »./Booom_2005:_The_First--E-Rotic“ nach »./Booom_2005_The_First--E-Rotic“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

./Bravo:_The_Hits_2000--Alannah_Myles --- ./Bravo_The_Hits_2000--Alannah_Myles
mv: das Verschieben von »./Bravo:_The_Hits_2000--Alannah_Myles“ nach »./Bravo_The_Hits_2000--Alannah_Myles/Bravo:_The_Hits_2000--Alannah_Myles“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

./Booom_2006:_The_First--Curse --- ./Booom_2006_The_First--Curse
mv: das Verschieben von »./Booom_2006:_The_First--Curse“ nach »./Booom_2006_The_First--Curse“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

./Gold:_Greatest_Hits--Boney_M. --- ./Gold_Greatest_Hits--Boney_M.
mv: Aufruf von stat für »./Gold:_Greatest_Hits--Boney_M.“ nicht möglich: Datei oder Verzeichnis nicht gefunden

./Black_Coffee_Chapter_1:_Ambientfunk_a_Mellowmoves--Aromabar --- ./Black_Coffee_Chapter_1_Ambientfunk_a_Mellowmoves--Aromabar
mv: das Verschieben von »./Black_Coffee_Chapter_1:_Ambientfunk_a_Mellowmoves--Aromabar“ nach »./Black_Coffee_Chapter_1_Ambientfunk_a_Mellowmoves--Aromabar“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

./Beethoven:_Fate--South_German_Philharmonic_Orchestra --- ./Beethoven_Fate--South_German_Philharmonic_Orchestra
mv: das Verschieben von »./Beethoven:_Fate--South_German_Philharmonic_Orchestra“ nach »./Beethoven_Fate--South_German_Philharmonic_Orchestra“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

./Bravo:_The_Hits_2002_Part_2--Kelly_Osbourne --- ./Bravo_The_Hits_2002_Part_2--Kelly_Osbourne
mv: das Verschieben von »./Bravo:_The_Hits_2002_Part_2--Kelly_Osbourne“ nach »./Bravo_The_Hits_2002_Part_2--Kelly_Osbourne“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

...

然后我尝试了一个命令行脚本 - 基于版本2

find . -type d | grep ':' |while IFS= read -rd '' line ; do new=$(echo "$line"|tr -d ':'); echo "$line" --- "$new"; mv "$line" "$new" ; done

并获得V2的输出(这是关于8000名导演的唯一线路)

find: "./Gold:_Greatest_Hits--Boney_M.": Datei oder Verzeichnis nicht gefunden
find: "./Nino_Rota:_Concerto_for_Strings,_\"La_Strada\"_Suite,_Dances_from_\"Il_Gattopardo\"--Riccardo_Muti": Datei oder Verzeichnis nicht gefunden
find: "./38?_Festivalbar_2001_Compilation_Blu--Christina_Aguilera": Datei oder Verzeichnis nicht gefunden
find: "./Gold:_20_Super_Hits--Boney_M.": Datei oder Verzeichnis nicht gefunden
find: "./Who_Is_It?--Ingrid_Laubrock": Datei oder Verzeichnis nicht gefunden
find: "./Let_It_All_Be_Music:_The_Party_Album--Boney_M.": Datei oder Verzeichnis nicht gefunden
find: "./Who_Let_the_Cats_Out?--Mike_Stern": Datei oder Verzeichnis nicht gefunden
find: "./tmp2/Who_Is_It?--Ingrid_Laubrock": Datei oder Verzeichnis nicht gefunden
find: "./tmp2/Who_Let_the_Cats_Out?--Mike_Stern": Datei oder Verzeichnis nicht gefunden
find: "./tmp2/Was_Ist_Passiert?--Pur": Datei oder Verzeichnis nicht gefunden
find: "./tmp2/Are_You_Looking_At_Me?--Colin_Hay": Datei oder Verzeichnis nicht gefunden
find: "./tmp2/Are_You_Experienced?--Jimi_Hendrix_Experience": Datei oder Verzeichnis nicht gefunden
find: "./tmp2/Whats_Wrong_with_This_Picture?--Van_Morrison": Datei oder Verzeichnis nicht gefunden
find: "./Was_Ist_Passiert?--Pur": Datei oder Verzeichnis nicht gefunden
find: "./Whats_Wrong_with_This_Picture?--Van_Morrison": Datei oder Verzeichnis nicht gefunden

好的,在检查'8000'目录时,15个错误行没有很多错误。但当我检查目录名称时,我发现它们都有原始名称。换句话说:大量的命令没有效果。

有没有一个bash-prof谁不想在圣诞节期间唱'Jingle Bells'? 很高兴收到你的来信!

PS:圣诞快乐,新年快乐,伙计们!