Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本在Find命令上循环:输出有空格_Bash_Find_Spaces - Fatal编程技术网

Bash脚本在Find命令上循环:输出有空格

Bash脚本在Find命令上循环:输出有空格,bash,find,spaces,Bash,Find,Spaces,我有下面的代码,它试图找到与某些模式匹配的所有文件,并将它们复制到一个新目录,如果文件已经存在,则添加一个后缀。这是因为重复的文件名出现在原始列表中,因为它们位于不同的目录中 除包含空格的fot文件名外,它按预期工作,for in-loop将其作为分隔符 这段代码来自stackoverflow的各个部分,我已经使用过,但我并不完全理解 我尝试过引用文件名的各种组合,以至于我只复制带有空格的文件 有人能建议我如何解决这个问题吗 patterns=( "wom*.gif" "StarB*.gif"

我有下面的代码,它试图找到与某些模式匹配的所有文件,并将它们复制到一个新目录,如果文件已经存在,则添加一个后缀。这是因为重复的文件名出现在原始列表中,因为它们位于不同的目录中

除包含
空格的fot文件名外,它按预期工作,
for in-loop
将其作为分隔符

这段代码来自stackoverflow的各个部分,我已经使用过,但我并不完全理解

我尝试过引用文件名的各种组合,以至于我只复制带有空格的文件

有人能建议我如何解决这个问题吗

patterns=( "wom*.gif" "StarB*.gif" "logos*.gif" )
for pattern in "${patterns[@]}"
do
  for fname in $(find $source -name $pattern); 
  do
    echo Path-and-Filename: $fname
    filename=$(basename "$fname")
    extension=${filename##*.}
    filename=${filename%.*}
    echo Just-Filename: $filename.$extension
    suffix=""
    count=0
    while [ -f $dest$filename$suffix.$extension ]
    do
      count=$(($count+1))
      suffix="("$count")"
    done

    cp -v -p "$fname" $dest"$filename"$suffix.$extension >>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log 2>>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log
  done
done

你做得有点好

对于“${pattern[@]}”中的模式
工作正常,空格保留在
模式
变量中

用于$中的fname(查找$源-名称$模式)已损坏。

请记住,
模式
包含空格。
将其固定到:

for fname in $(find "$source" -name "$pattern");

在后续语句中添加引号作为练习;-)

我使用@ORMAJ使用while循环进行阅读的想法,让它工作起来。我还没有正确计算出它的作用,但我现在已经复制了我所有的文件,这就是我想要的

我相信它仍然“脆弱”,任何建议都将不胜感激

我没有使用-print0,因为我不知道如何读取输出的行,它显示为一条长行。我假设我需要为每个文件名设置分隔符,但无法找到它。现在大脑速度很慢

patterns=( "*.gif" "*.GIF" "*.tif"  "*.TIF" "*.jpg" "*.JPG" "*.png" "*.PNG")
for pattern in "${patterns[@]}"
do
  find "/Volumes/Public/media_pics" -name "$pattern" | while IFS= read -r fname;
    do
      echo Full-Filename: "$fname"
      filename=$(basename "$fname")
      extension=${filename##*.}
      filename=${filename%.*}
      echo Just-Filename: $filename.$extension
      suffix=""
      count=0
      while [ -f $dest$filename$suffix.$extension ]
      do
        count=$(($count+1))
        suffix="("$count")"
      done

      cp -v -p "$fname" "$dest$filename$suffix.$extension" >>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log 2>>$dest"CopyImageFiles-"$(date +"%Y-%m-%d").log
  done
done

抱歉-看起来没有任何不同,带空格的文件名在
for in-loop
拆分的空格字符处创建了多个条目。错误。不能以这种方式迭代文件名。至少您已经帮助提高了脚本在遇到问题之前不失败的几率。@mcl请参阅关于练习的新增行;-)@Ormaj我阅读了您的参考资料,并试图实现
不读取for的行
,但我显然弄错了,因为在搜索匹配的文件后,我遇到了一个不明确的重定向错误。当IFS=read-r aline时,我尝试了
;做回显“$aline”;完成<$(查找“/Volumes/Public/media_pics”-name“*.gif”)
@mcl是否需要进程替换