unix 删除目录中所有文件名的下划线

ctzwtxfj  于 2023-01-08  发布在  Unix
关注(0)|答案(8)|浏览(205)

我有一个文件夹“模型”与文件命名如下:

a_EmployeeData
a_TableData
b_TestData
b_TestModel

我基本上需要去掉下划线,使它们:

aEmployeeData
aTableData
bTestData
bTestModel

在Unix命令行中是否有办法做到这一点?

d7v8vwbk

d7v8vwbk1#

这将正确地处理包含空格甚至换行符等奇怪字符的文件,并且应该在任何仅基于POSIX语法的Unix / Linux发行版上工作。

find model -type f -name "*_*" -exec sh -c 'd=$(dirname "$1"); mv "$1" "$d/$(basename "$1" | tr -d _)"' sh {} \;

下面是它的工作原理:
对于model目录及其子目录下名称中包含下划线的每个文件(而不是目录),请在适当的位置重命名该文件,去掉所有下划线。

9avjhtql

9avjhtql2#

您可以简单地使用bash来完成此操作。

for file in /path/to/model/*; do
mv "$file" "${file/_/}"
done

如果有rename命令可用,则只需执行

rename 's/_//' /path/to/model/*
xnifntxz

xnifntxz3#

for f in model/* ; do mv "$f" `echo "$f" | sed 's/_//g'` ; done

编辑:根据别人的建议修改了一些东西,但是我担心我的代码对于奇怪的文件名还是不好。

fslejnso

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,您可以

find . -name "*_*" -maxdepth 1 -print0 |  sed -z 'p;s/_//g' | xargs -0 -n2 echo mv

并且将处理带有空格的文件名。

v2g6jxz6

v2g6jxz65#

在zsh中:

autoload zmv # in ~/.zshrc
cd model && zmv '(**/)(*)' '$1${2//_}'
xyhw6mcr

xyhw6mcr6#

marc@panic:~$ echo 'a_EmployeeData' | tr -d '_'
aEmployeeData
w9apscun

w9apscun7#

我的机器上也有同样的问题,但是文件名有不止一个下划线。我使用renameg选项,这样所有的下划线都被删除了:

find model/ -maxdepth 1 -type f | rename 's/_//g'

或者,如果没有子目录,则只需

rename 's/_//g'

如果没有rename,请参阅Jaypal Singh's answer

kr98yfug

kr98yfug8#

在替换模式中使用全局标志/g来替换文件名中的所有匹配项。

find . -type f -print0 | xargs -0 rename 's/_//g'

或者,如果你想用空格替换下划线,那么使用这个:

find . -type f -print0 | xargs -0 rename 's/_/ /g'

如果你喜欢危险的生活,在你的替换模式rename -f 's/_//g'前面添加强制标志-f

相关问题