分析
您的脚本中有多个问题需要解决。让我们一步一步来:
tempDir=./tmp/
logDir=./logs/
for file in $( find `echo $logDir` -type f )
该方案假定文件名中没有空格(这不是一个不寻常的限制;避免名称中的空格问题相对棘手)。此外,不需要echo
; 写吧:
for file in $(find "$logDir" -type f)
继续:
do
name=eval basename $file
这将basename
在环境变量name
设置为 valueeval
和 argument的情况下运行命令$file
。你需要的是:
name=$(basename "$file")
双引号不是绝对必要的,因为名称不能包含空格(但是引用所有文件名并不是一个坏习惯,因为有时名称确实包含空格)。
echo $name
这将回显一个空行,因为未设置名称。
name=$(echo $name | sed 's/.$//')
如果设置了 name ,这将切断最后一个字符,但如果 name 是A
,你将一无所有。
echo $tempDir
opFile=$tempDir$name
echo $opFile
done
给或取双引号以及您没有将_tmp
后缀添加到的事实,opFile
其余部分没有任何问题。
合成
将更改放在一起,您最终会得到:
tempDir=./tmp/
logDir=./logs/
for file in $(find "$logDir" -type f)
do
name=$(basename "$file")
echo "$name" # Debug only
echo "$tempDir" # Debug only
opFile="$tempDir${name}_tmp"
echo "$opFile"
done
这显示了所有中间结果。您可以很好地将其压缩为:
tempDir=./tmp/
logDir=./logs/
for file in $(find "$logDir" -type f)
do
opFile="$tempDir"$(basename "$file")"_tmp"
echo "$opFile"
done
或者,使用更简单的双引号组合,因为名称不包含空格:
tempDir=./tmp/
logDir=./logs/
for file in $(find "$logDir" -type f)
do
opFile="$tempDir$(basename $file)_tmp"
echo "$opFile"
done
当然,回声是您计划执行的复制或移动操作的替代品。
编辑: ...并删除对包含空格和通配符的文件名的限制,请执行以下操作:
tempDir=./tmp/
logDir=./logs/
find "$logDir" -type f |
while IFS= read -r file
do
opFile="${tempDir}${file##*/}_tmp"
echo "$opFile"
done
对于包含换行符的文件名,它仍然会失败。如果您想处理该问题,请使用find ... -print0 | xargs -0
or调查解决方案find ... -exec
。