【问题标题】:Bash.Bad result of command substitutionBash.Bad 命令替换的结果
【发布时间】:2020-08-31 09:38:30
【问题描述】:

我想替换文件名中的空格。我的测试目录包含带空格的文件:

$ ls
'1 2 3.txt'  '4 5.txt'  '6 7 8 9.txt'

例如,这段代码可以正常工作:

$ printf "$(printf 'spaces in file name.txt' | sed 's/ /_/g')"
spaces_in_file_name.txt

我将下划线和命令替换上的空格替换为双引号作为文本。这种具有重要替换的构造在下一种情况下是必不可少的。 findxargs 等命令具有像 {}(大括号)这样的替换标记。因此下一条命令可以替换文件中的空格。

$ find ./ -name "*.txt" -print0 | xargs --null -I '{}' mv '{}' "$( printf '{}' | sed 's/ /_/g' )"
mv: './6 7 8 9.txt' and './6 7 8 9.txt' are the same file
mv: './4 5.txt' and './4 5.txt' are the same file
mv: './1 2 3.txt' and './1 2 3.txt' are the same file

但我得到错误。为了更清楚地考虑错误,我只使用 echo(或 printf)代替 mv

$ find ./ -name "*.txt" -print0 | xargs --null -I '{}' echo "$( printf '{}' | sed 's/ /_/g' )"
./6 7 8 9.txt
./4 5.txt
./1 2 3.txt

正如我们所见,下划线没有替换空格。但如果没有命令替换,替换将是正确的:

$ find ./ -name "*.txt" -print0 | xargs --null -I '{}' printf '{}\n' | sed 's/ /_/g'
./6_7_8_9.txt
./4_5.txt
./1_2_3.txt

所以命令替换大括号的事实是破坏结果(因为在第一个命令是正确的结果),但没有命令替换结果是正确的。但是为什么???

【问题讨论】:

  • 有一个不满意的重复 here,和一个跨站点答案 here,它是关于“找到”比 xargs 更多的东西,但正确地解释了问题

标签: bash sed find xargs


【解决方案1】:

使用循环非常快速和简单,只需将 absolute_path 替换为您的路径即可:

for f in absolute_path/*.txt; do mv "$f" "${f// /_}";done

${f// /_} 部分利用 bash 的参数扩展机制将参数中的模式替换为提供的字符串。

【讨论】:

    【解决方案2】:

    您的命令替换在之前运行 find 并且您正在执行

    mv '{}' "{}"
    

    您可以更改find 命令以匹配至少有一个空格字符的.txt 文件,并使用-exec 和一个小的bash 脚本来重命名文件:

    find . -type f -name "* *.txt" -exec bash -c '
      for file; do
        fname=${file##*/}
        mv -i "$file" "${file%/*}/${fname// /_}"
      done
    ' bash {} +
    
    • ${file##*/} 删除父目录(最长前缀模式*/)并保留文件名(如basename 命令)
    • ${file%/*} 删除文件名(最短后缀模式/*)并离开父目录(如dirname 命令)
    • ${fname// /_} 用下划线替换所有空格

    【讨论】:

    • 我可以看到使用 find 的任何值,您可以将文件 mv 到 "${file// /_}"
    • find 的值是它在所有子目录中搜索并使用模式* *.txt 仅重命名包含(至少)一个空格字符的文件。如果只处理一个目录,您的回答是有意义的。
    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多