Bash将文件移动到通配符目标
我有一些Bash将文件移动到通配符目标,bash,grep,Bash,Grep,我有一些.zip文件位于与.zip文件同名的目录相同的目录中。我试图使用某种通配符将.zip文件移动到相应的目录中 #!/usr/bin/env bash find "/Volumes/volume1/test/" -type f -name "*.zip" -print0 | while IFS= read -r -d $'\0' FILE; do ZIP="${FILE%.*}" echo $ZIP MATCH=${ZIP::${#ZIP}/3+${#ZIP}/2}
.zip
文件位于与.zip
文件同名的目录相同的目录中。我试图使用某种通配符将.zip
文件移动到相应的目录中
#!/usr/bin/env bash
find "/Volumes/volume1/test/" -type f -name "*.zip" -print0 |
while IFS= read -r -d $'\0' FILE; do
ZIP="${FILE%.*}"
echo $ZIP
MATCH=${ZIP::${#ZIP}/3+${#ZIP}/2}
echo ${MATCH##*/}
mv "$FILE" "$(ls -l|grep "^d.*${MATCH##*/}")"
done
但是grep
对$MATCH
中包含的空格有问题。我不知道如何将文件移动到目标名称中带有通配符的目录中
示例目录:
drwxrwx 1用户名staff 264 Jul 10 22:43[测试]Peter Jackson-这是一个测试目录[29.06.17][1080]{username}
示例.zip
while IFS= read -r -d '' file; do
zip="${file%.*}"
match=${zip::${#zip}/3+${#zip}/2}
candidate_dirs=( "$match"*/ )
if ! [[ -d "${candidate_dirs[0]}" ]]; then
echo "No candidate directories (starting with $match) found" >&2
elif (( ${#candidate_dirs[@]} != 1 )); then
echo "Exactly one candidate directory must exist; found ${#candidate_dirs[@]}" >&2
else
# emit a correctly escaped, eval-able command. Remove the printf '%q ' to actually mv
printf '%q ' mv -- "$file" "${candidate_dirs[0]}" && printf '\n'
fi
done < <(find "/Volumes/volume1/test/" -type f -name "*.zip" -print0)
-rw rw-1用户名staff 13956939 Jul 10 22:58[测试]Peter Jackson-这是一个测试目录[29.06.17][Hi Res]。当IFS=read-r-d''文件时,zip
;做
while IFS= read -r -d '' file; do
zip="${file%.*}"
match=${zip::${#zip}/3+${#zip}/2}
candidate_dirs=( "$match"*/ )
if ! [[ -d "${candidate_dirs[0]}" ]]; then
echo "No candidate directories (starting with $match) found" >&2
elif (( ${#candidate_dirs[@]} != 1 )); then
echo "Exactly one candidate directory must exist; found ${#candidate_dirs[@]}" >&2
else
# emit a correctly escaped, eval-able command. Remove the printf '%q ' to actually mv
printf '%q ' mv -- "$file" "${candidate_dirs[0]}" && printf '\n'
fi
done < <(find "/Volumes/volume1/test/" -type f -name "*.zip" -print0)
zip=“${file%.*}”
match=${zip::${zip}/3+${{zip}/2}
候选目录=(“$match”*/)
如果![[-d“${candidate_dirs[0]}”];然后
echo“未找到候选目录(以$match开头)>&2
elif(${候选人_dirs[@]}!=1);然后
echo“必须存在一个候选目录;找到${#candidate_dirs[@]}”>&2
其他的
#发出正确转义的、可评估的命令。将printf“%q”删除为
printf'%q'mv--“$file”“${candidate_dirs[0]}”和&printf'\n'
fi
我不懂你的代码。你能给我们举一个你正在使用的文件和目录名的例子吗?ls | grep
天生容易出错;请参阅。(-d$'\0'
可能会误导读者关于bash如何进行字符串解析——它生成与-d'
完全相同的字符串。您希望匹配是什么?对于您的示例数据,我得到声明--match=“[test]Peter Jackson-这是一个测试目录[29.06.1]
,这看起来不像您实际想要的。另外,请注意,所有caps名称都用于对shell和操作系统有意义的变量,而名称中带有小写字母的变量保证应用程序使用安全。请参阅第4段。这很完美-完全符合要求。感谢bunch、 还要解释一下!