我有一个包含许多.zip
文件的文件夹。它们的名字是这样的:
John-Rupert A. Doe_nnnnnnn_assignsubmission_file_*.zip
其中n
是数字,*
是字符串,John-Rupert A. Doe
是可能包含空格、点和破折号的字符串。
对于他们每个人,我想做以下事情:
创建一个目录。我通过以下方式执行此操作:
ls | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-' | xargs -L 1 mkdir
(因此,上面示例的相应目录名称为
JohnRupertADoe
)现在我想将每个文件提取到使用此文件名
.zip
创建的目录中。.zip
但如何呢?
答案1
你可以尝试:
for z in ./*.zip
do name="${z%%_*}"; dest=".${name//[ .-]/}"; mkdir "$dest"; unzip "$z" -d "$dest"
done
对于每个z
ip 文件,它提取名称部分(${z%%_*}
贪婪地删除后缀),然后删除所有出现的点、破折号和空格 ( ${name//[ .-]/}
),并将生成的字符串作为参数传递以mkdir
创建相应的目录。然后它将存档解压缩到指定的d
目的地。
答案2
未经测试:
for i in *.zip; do
zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-'; }
zipdir | xargs -L 1 mkdir
mv "$i" "$(zipdir)"/
done
或者要删除两个tr
管道,您可以将管道添加到sed
(也未经测试):
for i in *.zip; do
zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g;s/.//g;s/-//g'; }
zipdir | xargs -L 1 mkdir
mv "$i" "$(zipdir)"/
done