在所有子类别中重命名带空格的文件以下划线

时间:2016-10-21 23:06:57

标签: linux bash terminal command

我有类别/产品/和子类别。我需要一行命令来删除从名称到下划线的空格,如果它的2个空格只放置1个下划线。重命名命令在此服务器上不起作用。 我一直在使用for file in *; do mv "$file" echo $file | tr ' ' '_' ; done,但它对子类别不起作用我有很多,加上如果有2个空格这个命令会产生2个下划线,我需要不同。 请指教

2 个答案:

答案 0 :(得分:0)

更新

OP发现(如此处所示:https://stackoverflow.com/a/40227451/3544399)一种更可靠的方法来从文件中删除空格,他在此注意到:https://unix.stackexchange.com/a/223185

  

find -name“* *” - print0 | sort -rz | \ read read -d $'\ 0'f;做mv   -v“$ f”“$(dirname”$ f“)/ $(basename”$ {f // / _}“)”;完成

原始答案(如果使用bash兼容版本的 GNU sed

您可以使用findsed吗?

修改:

作为一个班轮:

find "$(pwd)" -type f -print0 | while IFS= read -d '' file ; do newfile="$(echo "$file" | sed -E 's/\s+/_/g')" ; newcmd='mv -v "'"$file"'" "'"$newfile"'"' ; echo "$newcmd" ; done
find "$(pwd)" -type f -print0 | while IFS= read -d '' file
do 
newfile="$(echo "$file" | sed -E 's/\s+/_/g')"
newcmd='mv -v "'"$file"'" "'"$newfile"'"'

#for test run use echo
echo "$newcmd"

#for real run use eval
eval "$newcmd"

done

我发现在文件名中搜索和替换的一般风格可靠。有几个原因我不仅仅使用替代品而且我不记得它们,但这里的关键点是;

  • 您不受$IFS变量
  • 的支配
  • 非常奇怪的文件名将用引号括起来,适合执行
  • 您没有直接在glob扩展程序上执行mv命令
  • \s+中的sed将替换一个或多个空格,视需要

答案 1 :(得分:0)