我现在正在开发一个脚本,按照一些指令将一些文件从目录 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 ,我需要坚持使用\space
sed 's/ /\\ /g'
ls
find
答案1
由于您使用的是-maxdepth 1
and -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-)"