您的问题有点不清楚您的目录名称是否由 last 空格之前的所有字符组成,您的评论有所帮助,但 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(或进一步解析解析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"。
如果您仍然存在沟通问题,请再发表评论。