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、 还要解释一下!