>/foo--6ren">
gpt4 book ai didi

linux - 根据带空格的文件名将文件移动到子目录

转载 作者:太空宇宙 更新时间:2023-11-04 09:14:28 24 4
gpt4 key购买 nike

此脚本的目的是根据文件名内容创建一个目录。文件名如下所示:

  • “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。

最佳答案

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

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

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

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

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

然后只需将文件移动到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(或进一步解析 parse 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"

如果您仍然存在沟通问题,请再发表评论。

关于linux - 根据带空格的文件名将文件移动到子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49764471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com