重命名包含空格.ksh的文件名

时间:2019-03-17 15:08:16

标签: bash shell unix ksh

我正在尝试重命名包含空格的文件。 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

4 个答案:

答案 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)

您可以找到findawk命令

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以执行它们

希望这会有所帮助