用于在目录中单独列出文件名的shell脚本&重命名

时间:2016-05-02 05:00:44

标签: linux bash file shell

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

首先,我尝试在特定目录中获取文件名..所以我按照下面的脚本代码

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

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

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

6 个答案:

答案 0 :(得分:2)

尝试遵循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
  • 在其值的末尾匹配.*.为文字字符)
  • 删除最短匹配模式

答案 1 :(得分:1)

查看prename(与ubuntu上的perl软件包一起安装)。 然后你可以做类似的事情:

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

答案 2 :(得分:0)

在ksh中你可以这样做:

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

答案 3 :(得分:0)

从根目录运行此重命名命令应该有效:

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

答案 4 :(得分:0)

这应该可以解决问题:

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

答案 5 :(得分:-1)

for ls -la /path|grep -v ^d|awk '{print $NF}'

echo“basename $i” 完成了

它将为您提供所有文件的基本名称,或者您可以在下面尝试

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