我有类别/产品/和子类别。我需要一行命令来删除从名称到下划线的空格,如果它的2个空格只放置1个下划线。重命名命令在此服务器上不起作用。
我一直在使用for file in *; do mv "$file" echo $file | tr ' ' '_' ; done
,但它对子类别不起作用我有很多,加上如果有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
您可以使用find
和sed
吗?
修改:
作为一个班轮:
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
变量mv
命令\s+
中的sed
将替换一个或多个空格,视需要答案 1 :(得分:0)