此脚本的目标是基于文件名内容创建目录。文件名如下所示:
我希望能够创建一个名为" foo-foo bar-bar-bar1"的文件夹。等等目录中的所有文件。 (要创建数百个目录)并将包含该扩展名的所有文件放入其中。
问题是有空格而不是" _"文件扩展名之间。而且,一些文件名之间有多个空格。 我该如何开始解决这个问题?如果有帮助,我正在使用Mac。
答案 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")