我正在尝试重命名包含空格的文件。 IFS = $'\ n'实际上是因为FOR循环现在可以处理带有空格的那些文件名。不幸的是,DIR中的所有.csv文件都插入变量FL中,这会导致错误。有没有办法让变量FL一次处理一个文件,同时又处理文件名中的空格?
脚本:
IFS=$'\n'
for FL in `ls -1 ${DIR}/*.csv`
do
FL_DP=`echo ${FL}`
FL_RN=`echo ${FL_DP} | tr -d '[:blank:]'`
mv ${FL_DP} ${FL_RN}
done
结果:
+ IFS=$\n
+ ls -1 test _1.csv test _2.csv
++ echo test _1.csv
test _2.csv
FL_DP=test _1.csv
test _2.csv
++ echo test _1.csv
test _2.csv
FL_RN=test_1.csv
test_2.csv
+ mv test _1.csv
test _2.csv test_1.csv
test_2.csv
mv: cannot access test _1.csv
test _2.csv
预期结果:
+ ls -1 test _1.csv test _2.csv
++ echo test _1.csv
FL_DP=test _1.csv
++ echo test _1.csv
FL_RN=test_1.csv
mv test _1.csv test_1.csv
答案 0 :(得分:1)
您可能只需要用空格将变量引起来。但是@Cyrus对解析ls输出有很好的理解。进行诱人时,应将其视为人类可读的数据。
这是不使用ls的方法:
for f in "$dir"/*.csv; do mv -i "$dir/$f" "$dir/${f// /}"; done
答案 1 :(得分:0)
在FL_DP中将“反引号”更改为"quotes"
不解析ls,只需使用for file in dirname..
IFS=$'\n'
for FL in {DIR}/*.csv
do
FL_DP="${FL}"
FL_RN=`echo ${FL_DP} | tr -d '[:blank:]'`
mv ${FL_DP} ${FL_RN}
done
答案 2 :(得分:0)
以下是使用find,while和read的示例:
find . -type f | while
read filename
do
echo "$filename"
done
以下是将上述构造应用于您的特定问题的方法:
find $DIR -name '*.csv' -type f | while
read filename
do
mv "$filename" ${filename/ /}
done
答案 3 :(得分:0)
您可以找到find
和awk
命令
find . -name "*.csv" -printf "mv \"%f\" |\"%f\" \n" | awk -F"|" ' { gsub(" ","",$2); print } '
样本测试
$ ls -1 *csv
scores.csv
'test _1.csv'
'test _2.csv'
$ find . -name "*.csv" -printf "mv \"%f\" |\"%f\" \n" | awk -F"|" ' { gsub(" ","",$2); print } '
mv "scores.csv" "scores.csv"
mv "test _1.csv" "test_1.csv"
mv "test _2.csv" "test_2.csv"
$
这里printf使用%f标识符打印文件名,只需添加管道并打印两次文件名即可。
我在这里使用管道,因为它不会出现在文件名中。现在,使用“ |”将结果传递给awk命令作为分隔符,并使用gsub()函数替换空格。
最终结果可以再次传递给ksh以执行它们
希望这会有所帮助