for 将文件中的空格检测为多行

for 将文件中的空格检测为多行

我现在正在开发一个脚本,按照一些指令将一些文件从目录 A 复制到多个目录 B ,该脚本工作正常,但是当涉及到带有空格的文件时,他只是将它们视为多个文件,例如:

my_super_cool_file_2007039904_11 (3rd copy).pdf

当文件处于此循环中时:

for i in $(find $parent -mindepth 1 -maxdepth 1 -type f|cut -c 11-);do
echo "this is the file: $i" 
done

它被视为多个文件:

  this is the file: my_super_cool_file_2007039904_11
  this is the file: (3rd 
  this is the file: copy).pdf

我尝试用 usingspace替换,但它似乎没有解决我的问题,对于循环来说,它是 3 个不同的文件,我也有同样的问题 using ,我需要坚持使用\spacesed 's/ /\\ /g' lsfind

答案1

由于您使用的是-maxdepth 1and -mindepth 1,您也可以只做一个简单的循环(在bash):

for name in "$parent"/*; do
    if [ -f "$name" ]; then
        dir=${name%/*}  # dir=$( dirname "$name" )
        dir=${dir##*/}  # dir=$( basename "$dir" )
        printf 'The directory is "%s"\n' "$dir"
    fi
done

循环的结果find通常是不好的做法:为什么循环查找的输出是不好的做法?

答案2

假设cut -c 11-要使用 GNU 删除文件路径的目录部分find

find "$parent" -mindepth 1 -maxdepth 1 -type f -printf \
  'this is the file: %f\n'

对于任何 POSIX find

find "$parent/." ! -name . -prune -type f -exec sh -c '
  for file do
    file=${file##*/}
    printf "this is the file: %s\n" "$file"
  done' sh {} +

更多阅读:

答案3

将 $(find $parent -min深度 1 -max深度 1 -type f|cut -c 11-) 放在引号中,这样:

 "$(find $parent -mindepth 1 -maxdepth 1 -type f|cut -c 11-)"

相关内容