我有一个文件夹“模型”与文件命名如下:
a_EmployeeData a_TableData b_TestData b_TestModel
我基本上需要去掉下划线,使它们:
aEmployeeData aTableData bTestData bTestModel
在Unix命令行中是否有办法做到这一点?
d7v8vwbk1#
这将正确地处理包含空格甚至换行符等奇怪字符的文件,并且应该在任何仅基于POSIX语法的Unix / Linux发行版上工作。
find model -type f -name "*_*" -exec sh -c 'd=$(dirname "$1"); mv "$1" "$d/$(basename "$1" | tr -d _)"' sh {} \;
下面是它的工作原理:对于model目录及其子目录下名称中包含下划线的每个文件(而不是目录),请在适当的位置重命名该文件,去掉所有下划线。
9avjhtql2#
您可以简单地使用bash来完成此操作。
bash
for file in /path/to/model/*; do mv "$file" "${file/_/}" done
如果有rename命令可用,则只需执行
rename
rename 's/_//' /path/to/model/*
xnifntxz3#
for f in model/* ; do mv "$f" `echo "$f" | sed 's/_//g'` ; done
编辑:根据别人的建议修改了一些东西,但是我担心我的代码对于奇怪的文件名还是不好。
fslejnso4#
也许是这样:
find model -name "*_*" -type f -maxdepth 1 -print | sed -e 'p;s/_//g' | xargs -n2 echo mv
分解:
model
plain files
sed
_
xargs
mv
以上是试运行。如果满意,删除mv之前的echo,以便实际重命名。警告:如果文件名包含空格,将无法工作。如果您有GNU sed,您可以
echo
GNU sed
find . -name "*_*" -maxdepth 1 -print0 | sed -z 'p;s/_//g' | xargs -0 -n2 echo mv
并且将处理带有空格的文件名。
v2g6jxz65#
在zsh中:
autoload zmv # in ~/.zshrc cd model && zmv '(**/)(*)' '$1${2//_}'
xyhw6mcr6#
marc@panic:~$ echo 'a_EmployeeData' | tr -d '_' aEmployeeData
w9apscun7#
我的机器上也有同样的问题,但是文件名有不止一个下划线。我使用rename和g选项,这样所有的下划线都被删除了:
g
find model/ -maxdepth 1 -type f | rename 's/_//g'
或者,如果没有子目录,则只需
rename 's/_//g'
如果没有rename,请参阅Jaypal Singh's answer。
kr98yfug8#
在替换模式中使用全局标志/g来替换文件名中的所有匹配项。
/g
find . -type f -print0 | xargs -0 rename 's/_//g'
或者,如果你想用空格替换下划线,那么使用这个:
find . -type f -print0 | xargs -0 rename 's/_/ /g'
如果你喜欢危险的生活,在你的替换模式rename -f 's/_//g'前面添加强制标志-f
rename -f 's/_//g'
-f
8条答案
按热度按时间d7v8vwbk1#
这将正确地处理包含空格甚至换行符等奇怪字符的文件,并且应该在任何仅基于POSIX语法的Unix / Linux发行版上工作。
下面是它的工作原理:
对于model目录及其子目录下名称中包含下划线的每个文件(而不是目录),请在适当的位置重命名该文件,去掉所有下划线。
9avjhtql2#
您可以简单地使用
bash
来完成此操作。如果有
rename
命令可用,则只需执行xnifntxz3#
编辑:根据别人的建议修改了一些东西,但是我担心我的代码对于奇怪的文件名还是不好。
fslejnso4#
也许是这样:
分解:
model
中至少包含一个下划线的所有plain files
,并且不搜索子目录sed
进行文件名调整-不使用任何内容替换_
xargs
,将文件重命名为mv
以上是试运行。如果满意,删除
mv
之前的echo
,以便实际重命名。警告:如果文件名包含空格,将无法工作。如果您有
GNU sed
,您可以并且将处理带有空格的文件名。
v2g6jxz65#
在zsh中:
xyhw6mcr6#
w9apscun7#
我的机器上也有同样的问题,但是文件名有不止一个下划线。我使用
rename
和g
选项,这样所有的下划线都被删除了:或者,如果没有子目录,则只需
如果没有
rename
,请参阅Jaypal Singh's answer。kr98yfug8#
在替换模式中使用全局标志
/g
来替换文件名中的所有匹配项。或者,如果你想用空格替换下划线,那么使用这个:
如果你喜欢危险的生活,在你的替换模式
rename -f 's/_//g'
前面添加强制标志-f