【问题标题】:shell script to list file names alone in a directory & rename it [duplicate]shell脚本在一个目录中单独列出文件名并重命名它[重复]
【发布时间】:2016-08-26 19:05:00
【问题描述】:

我是脚本概念的新手。我需要将 filename.sh.x 等目录中的多个文件重命名为 filename.sh

首先我尝试获取特定目录中的文件名.. 所以我遵循以下脚本代码

for entry in PathToThedirectory/*sh.x
do
   echo $entry
done

&上面的代码列出了所有带有完整路径的文件名..

但我预期的 o/p 是:单独获取文件名,如 abc.sh.x, 这样我就可以继续使用拆分字符串机制来执行重命名 操作简单... 帮我解决这个问题...在此先感谢

【问题讨论】:

  • 看看rename 命令及其正则表达式功能。
  • 这个问题与 C 无关。请删除该标签。
  • 我明白了.. 谢谢你

标签: linux bash file shell


【解决方案1】:

尝试遵循 OP 建议的第一种方法:

for i in my/path/*.py.x
do
    basename=$(basename "$i")
    mv my/path/"$basename" my/path/"${basename%.*}"
done

也许,你可以简化它:

for i in my/path/*.py.x
do
    mv "$i" "${i%.*}";
done

关于这种操作的文档(参数扩展):https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

特别是:

${parameter%word} :单词被扩展以产生一个模式,就像在文件名扩展中一样。如果模式匹配参数扩展值的尾随部分,则扩展结果是具有最短匹配模式('%' 情况)或最长匹配模式('%%' 情况)的参数值已删除

所以,${i%.*} 的意思是:

  • 拍下$i
  • 在其值的末尾匹配.*. 是文字字符)
  • 删除最短匹配模式

【讨论】:

  • 为什么是“也许”?第二个解决方案对我来说看起来更干净,不需要外部工具,并且可能更快。
  • 嗯,第一个听起来更像是 OP 所要求的 (get file names alone) ...但是是的,你是对的。
  • 啊,是的,但是“单独获取文件名”是如何以次优方式解决问题的想法的一部分;)据我所知,这个答案也是唯一一个没有需要外部工具,正确引用,不会因带有特殊字符的文件名而中断,不会删除错误的东西......干得好。
  • 我明白了.. 谢谢你
  • 第二个非常好,比我预期的要快...
【解决方案2】:

对于我在ls -la /path|grep -v ^d|awk '{print $NF}'

回显“basename $i” 完成了

它会给你所有文件的基本名称,或者你可以在下面尝试

find /path -type f -exec basename {} \;

【讨论】:

【解决方案3】:

从根目录运行这个重命名命令应该可以工作:

rename 's/\.sh\.x$/.sh/' *.sh.x

【讨论】:

  • 文件abshcx.sh.x将重命名为a.sh.sh.x...
  • 我明白了.. 谢谢你
  • 感谢 anishsane。更新了答案。
  • 现在,文件ab.sh.x.c.sh.x 将重命名为ab.sh.c.sh.x :-) 你忘记在匹配字符串正则表达式中添加$...
【解决方案4】:

这应该可以解决问题:

for file in *.sh.x; 
do 
   mv "$file " "${file /.sh.x}"; 
done

【讨论】:

  • 这会删除.sh.x 而不仅仅是.x,并且它不能确保要删除的字符串位于文件名的末尾。
  • 我明白了.. 谢谢你
【解决方案5】:

查看prename(与 ubuntu 上的 perl 包一起安装)。 然后你可以这样做:

prename 's/\.x$//' *.sh.x

【讨论】:

  • 我明白了.. 谢谢你
【解决方案6】:

在 ksh 中你可以这样做:

for $file in $(ls $path)
do
    new_file=$(basename $path/$file .x)
    mv ${path}/${file} ${path}/${new_file}   
done

【讨论】:

  • 我得到了答案.. 谢谢你
最近更新 更多