Bash脚本将文件移动到以文件命名的文件夹

时间:2014-06-15 11:39:39

标签: macos bash sed scripting terminal

脚本的新手。
我试着做以下几点 我有一个包含以下内容的文件夹:

/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

我设法得到我想要的名字,但我无法创建/移动到文件夹。

3 个答案:

答案 0 :(得分:1)

这应该是你提供的例子:

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

哦,这不会做任何事情,只回显将要执行的命令。如果您对所看到的内容感到满意,请移除这两个echo。 (从/folder内执行。)

答案 1 :(得分:1)

你的报价错了。你应该基本上总是在带有文件名的变量周围使用双引号(在其他情况下也是大部分时间)。

此外,您不应解析ls输出,而是使用for循环,而不是惯用。

最后,使用shell的内置字符串替换而不是两个外部进程更有效。

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

答案 2 :(得分:1)

我刚刚使用过这个,但做了以下改动:

dir=${file%% -*}  

dir=${file%%.*}

因为我的名字仍然是文件扩展名的文件夹 上述变化消除了这一点 谢谢!

为了方便而粘贴在下面

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

只需将.mpg替换为您要查找的文件类型即可。

编辑: 重要!
确保您的文件名不包含任何“。” 以上创建文件夹名称直到第一个“。”它在文件名中找到。