Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Bash脚本将文件移动到以文件命名的文件夹中_Macos_Bash_Sed_Scripting_Terminal - Fatal编程技术网

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

Macos Bash脚本将文件移动到以文件命名的文件夹中,macos,bash,sed,scripting,terminal,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 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

我设法获得了所需的名称,但无法创建/移动到文件夹。

这应该可以,使用您提供的示例:

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

哦,这不会做任何事情,只是回显将要执行的命令。如果您对看到的内容感到满意,请删除两个
echo
s。(从
/文件夹中执行它)。

应该这样做,使用您提供的示例:

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

哦,这不会做任何事情,只是回显将要执行的命令。如果您对看到的内容感到满意,请删除两个
echo
s。(从
/文件夹中执行它)。

应该这样做,使用您提供的示例:

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

哦,这不会做任何事情,只是回显将要执行的命令。如果您对看到的内容感到满意,请删除两个
echo
s。(从
/文件夹中执行它)。

应该这样做,使用您提供的示例:

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

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

您的引用是错误的。基本上,您应该始终在带有文件名的变量周围使用双引号(大多数情况下,在其他情况下也是如此)

此外,您不应该解析
ls
输出,而应该按照惯用方式使用
for
循环

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

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

你的报价是错误的。基本上,您应该始终在带有文件名的变量周围使用双引号(大多数情况下,在其他情况下也是如此)

此外,您不应该解析
ls
输出,而应该按照惯用方式使用
for
循环

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

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

你的报价是错误的。基本上,您应该始终在带有文件名的变量周围使用双引号(大多数情况下,在其他情况下也是如此)

此外,您不应该解析
ls
输出,而应该按照惯用方式使用
for
循环

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

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

你的报价是错误的。基本上,您应该始终在带有文件名的变量周围使用双引号(大多数情况下,在其他情况下也是如此)

此外,您不应该解析
ls
输出,而应该按照惯用方式使用
for
循环

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

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

我只是使用了这个,但做了以下更改:

dir=${file%% -*}  

因为我正在获取文件扩展名仍在名称中的文件夹。
上述更改将删除该选项。
谢谢大家!

贴在下面方便

for file in *.mpg; do
    dir=${file%%.*}
    echo mkdir -p -- "$dir"
    echo mv "$file" "$dir"
done
只需将.mpg替换为您要查找的文件类型

编辑: 重要
确保您的文件名不包含任何“.”

上面创建的文件夹名一直到第一个“.”它在文件名中找到。

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

dir=${file%% -*}  

因为我正在获取文件扩展名仍在名称中的文件夹。
上述更改将删除该选项。
谢谢大家!

贴在下面方便

for file in *.mpg; do
    dir=${file%%.*}
    echo mkdir -p -- "$dir"
    echo mv "$file" "$dir"
done
只需将.mpg替换为您要查找的文件类型

编辑: 重要
确保您的文件名不包含任何“.”

上面创建的文件夹名一直到第一个“.”它在文件名中找到。

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

dir=${file%% -*}  

因为我正在获取文件扩展名仍在名称中的文件夹。
上述更改将删除该选项。
谢谢大家!

贴在下面方便

for file in *.mpg; do
    dir=${file%%.*}
    echo mkdir -p -- "$dir"
    echo mv "$file" "$dir"
done
只需将.mpg替换为您要查找的文件类型

编辑: 重要
确保您的文件名不包含任何“.”

上面创建的文件夹名一直到第一个“.”它在文件名中找到。

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

dir=${file%% -*}  

因为我正在获取文件扩展名仍在名称中的文件夹。
上述更改将删除该选项。
谢谢大家!

贴在下面方便

for file in *.mpg; do
    dir=${file%%.*}
    echo mkdir -p -- "$dir"
    echo mv "$file" "$dir"
done
只需将.mpg替换为您要查找的文件类型

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