2014-06-15 158 views
0

相當新穎的腳本。
我試圖做到以下幾點。
我有一個包含文件夾:Bash腳本將文件移動到以該文件命名的文件夾

/folder/Tv Series Name S01E01 - Episode Name A.avi 
/folder/Tv Series Name S01E02 - Episode Name B.avi 
/folder/Tv Series Name S01E03 - Episode Name C.avi 
/folder/Tv Series Name S01E04 - Episode Name D.avi 
/folder/Tv Series Name S01E05 - Episode Name E.avi 

我想創建一個文件夾,然後將文件移動到它的特定文件夾:

/folder/Tv Series Name S01E01/Tv Series Name S01E01 - Episode Name A.avi 
/folder/Tv Series Name S01E02/Tv Series Name S01E02 - Episode Name B.avi 
/folder/Tv Series Name S01E03/Tv Series Name S01E03 - Episode Name C.avi 
/folder/Tv Series Name S01E04/Tv Series Name S01E04 - Episode Name D.avi 
/folder/Tv Series Name S01E05/Tv Series Name S01E05 - Episode Name E.avi 

我曾嘗試:

cd ...Path/folder 
ls -1 | 
while read filename 
do 
newPath=`echo $filename|sed "s/-[^-]*$//"` 
mv $filename ...Path/folder/$newPath/$filename 
done 

我設法得到我想要的名字,但我無法創建/移動到文件夾。

回答

1

您的報價是錯誤的。基本上應該總是在文件名變量周圍使用雙引號(在其他情況下大多數情況下也是如此)。

此外,您不應該解析ls輸出,而是使用for循環代替地道。

最後,使用shell的內置字符串替換而不是兩個外部進程會更高效。

cd .../Path/to/folder 
for filename in *; do 
    newPath=${filename%\ -*} 
    mkdir -p "$newPath" 
    mv "$filename" "$newPath" 
done 
+0

謝謝。這解決了我的問題。 – user3326571

1

這應該做的,你所提供的例子:

for file in *.avi; do 
    dir=${file%% -*} 
    echo mkdir -p -- "$dir" 
    echo mv "$file" "$dir" 
done 

哦,這不會做任何事情,只能隨聲附和將要執行的命令。如果您對所看到的滿意,請刪除兩個echo。 (從/folder內執行)。

1

我只是用這個,但做了如下變化:

dir=${file%% -*} 

dir=${file%%.*} 

因爲我得到的文件夾與文件擴展名仍在名稱。
上述更改將刪除該更改。
謝謝!

粘貼下面的convienience

for file in *.mpg; do 
    dir=${file%%.*} 
    echo mkdir -p -- "$dir" 
    echo mv "$file" "$dir" 
done 

只是文件的您正在尋找的類型更換.MPG。編輯: 重要!
確保您的文件名不包含任何「。」。
以上創建文件夾名稱,直到第一個「。」。它在文件名中找到。

相關問題