将文件移动到基​​于带空格的文件名的子目录

时间:2018-04-11 00:01:42

标签: linux bash macos command-line terminal

此脚本的目标是基于文件名内容创建目录。文件名如下所示:

  • " foo-foo bar-bar-bar1 5644.jpg"
  • " foo-foo bar-bar-bar1 5648.jpg" >> / foo-foo bar-bar-bar1
  • " foo-foo bar-bar-bar2 7644.jpg"
  • " foo-foo bar-bar-bar2 7648.jpg" >> / foo-foo bar-bar-bar2

我希望能够创建一个名为" foo-foo bar-bar-bar1"的文件夹。等等目录中的所有文件。 (要创建数百个目录)并将包含该扩展名的所有文件放入其中。

问题是有空格而不是" _"文件扩展名之间。而且,一些文件名之间有多个空格。 我该如何开始解决这个问题?如果有帮助,我正在使用Mac。

2 个答案:

答案 0 :(得分:2)

关于您的目录名是否由 last 空格之前的所有字符组成,您的问题有点不清楚,您的评论有所帮助,但 extension-1 extension-2 解释仍然存在一些不确定性,但我认为我们正在沟通。

要根据文件名中包含的所有内容创建目录,直到最后一个空格,您可以使用简单的参数扩展和子字符串删除。例如,要删除从右侧到最终空间(包括)的所有内容,您将使用dname="${file% *}"(其中dname是生成目录名称以将文件移动到)。例如:

file="foo-foo bar-bar-bar1 5648.jpg"
dname="${file% *}"

现在dname包含:"foo-foo bar-bar-bar1"

注意:参数展开,{em>左的#修剪,右边的%修剪。##修剪从左边开始的最后一次出现,而#仅修剪到第一次出现。%从相反的方向以相同的方式工作)

然后只需将文件移动到dname,您可以使用进程替换(使用find命令搜索当前目录下的所有.jpg文件,并在所呈现的目录中创建新的目录集,以及一个简单的:

while read file; do
    fname="${file##*/}"   ## strip path information, leaving filename
    dname="${fname% *}"   ## get all chars before the last space
    mkdir -p "$dname"     ## create the directory (no error if it exists)
                          #  (add -i to be prompted if dir exists)
    mv "$file" "$dname"   ## move the file to the new directory
done < <(find . -type f -name "*.jpg")

您可以附加到dname(或进一步解析解析file)以将目录放在除当前目录之外的其他位置。

另请注意,如果您要进一步解析文件名,以便移动的文件为"5648.jpg"而不是完整的"foo-foo bar-bar-bar1 5648.jpg",则只需使用类似的文件:

finalname="${fname##* }"

然后你的行动将是:

mv "$file" "$dname/$finalname"

如果您有任何问题,请告诉我。

将最后一个空格分隔段用作目录名称(ext-2)

如果我们正在使用"cc-19 a-18-1a 6790.jpg"并将文件移动到"a-18-1a"目录,那么解析find返回的文件名的系列将如下所示:

while read file; do
    fname="${file##*/}"   ## strip path information, leaving filename
    dname="${fname% *}"   ## get all chars before the last space
    dname="${dname##* }"  ## trim ext-1, leaving ext-2
    mkdir -p "$dname"     ## create the directory (no error if it exists)
                          #  (add -i to be prompted if dir exists)
    mv "$file" "$dname"   ## move the file to the new directory
done < <(find . -type f -name "*.jpg")

这会将"cc-19 a-18-1a 6790.jpg"移至"./a-18-1a"

如果您仍然存在沟通问题,请删除其他评论。

答案 1 :(得分:0)

这就是答案! @ david-c-rankin这个有效。谢谢你的帮助。

while read file; do
    fname="${file##*/}"   ## strip path information, leaving filename
    dname="${fname% *}"   ## get all chars before the last space
    dname="${dname%%* }"  ## trim ext 3 from filename
    mkdir -p "$dname"     ## create the directory (no error if it exists)
                          #  (add -i to be prompted if dir exists)
    mv -i "$file" "$dname"   ## move the file to the new directory
done < <(find . -type f -name "*.txt")