如何更改bash中没有类型的文件的文件名

时间:2016-10-05 20:13:09

标签: bash

我正在尝试重命名一堆文件,使用带有findrename的bash脚本替换特定字符串。当我指定文件类型时,这适用于文件,但我有一些我需要更改的文件没有文件类型,我无法弄清楚如何重命名它们。

对于带有文件类型的文件,我成功使用它来将$ old_session替换为$ new_session,例如在每个.jpg文件中:

old_session='123'
new_session='456'
find my_folder -name '*.jpg' -type f -exec rename $old_session $new_session *.jpg {} \;

但是当我尝试对没有文件类型的文件做同样的事情时,没有任何反应:

find my_folder -name '*' -type f -exec rename $old_session $new_session * {} \;

find my_folder -name '*${old_session}*' -type f -exec rename $old_session $new_session *${old_session}* {} \;

如何更改未指定类型的文件的文件名?

谢谢!

2 个答案:

答案 0 :(得分:1)

适用于模式*.jpg,因为您运行jpg的文件夹中没有find个文件,并且shell将*.jpg未展开传递给{{1}将未经扩展传递给find的命令,它可以正常工作。

但是当你这样做时:

rename

使用来自当前目录的所有文件展开find my_folder -name '*' -type f -exec rename $old_session $new_session * {} \; 并按原样传递给*,这不是您想要的。

改为:

rename

(这对于find my_folder -name '*' -type f -exec rename $old_session $new_session "*" {} \; 文件来说也更好BTW:))

答案 1 :(得分:0)

我会这样做:

让我们说“old_session”是kkk而我们的“new_session”是“noname”

考虑目录中的以下文件。几个kkk和.sh文件。

bash$> ls -lrt
total 0
-rw-r--r--. 1 root root 0 Oct  7 03:03 3432kkk
-rw-r--r--. 1 root root 0 Oct  7 03:03 334kkk
-rw-r--r--. 1 root root 0 Oct  7 03:03 222kkk
-rw-r--r--. 1 root root 0 Oct  7 03:03 190kkk
-rw-r--r--. 1 root root 0 Oct  7 03:03 123kkk
-rw-r--r--. 1 root root 0 Oct  7 03:03 c.sh
-rw-r--r--. 1 root root 0 Oct  7 03:03 b.sh
-rw-r--r--. 1 root root 0 Oct  7 03:03 a.sh

使用的命令/脚本将执行以下步骤:

  1. 它将找到目录中的所有文件。
  2. 从前面删除./(作为find命令的结果)。
  3. grep out包含点的任何文件名,这意味着一个扩展名(例如:c.sh有一个点,因此它将被过滤)。
  4. 逐个读取文件名列表,使用(new = echo $file|sed "s/$old_session//g")命令准备新名称。
  5. 重命名是使用mv命令。
  6. 打印出操作结果。
  7. 在处理验证后显示ls -lrth输出。
  8. 这是命令/脚本及其输出。

    bash$> find . -type f | sed 's/^\.\///g' | grep -v "\." | while read file
    > do
    > new=`echo $file|sed "s/$old_session//g"`
    > mv $file ${new}_${new_session}
    > echo "$file renamed to ${new}_${new_session}"
    > done
    ls -lrt
    123kkk renamed to 123_noname
    222kkk renamed to 222_noname
    334kkk renamed to 334_noname
    3432kkk renamed to 3432_noname
    190kkk renamed to 190_noname
    bash$> ls -lrt
    total 0
    -rw-r--r--. 1 root root 0 Oct  7 03:03 c.sh
    -rw-r--r--. 1 root root 0 Oct  7 03:03 b.sh
    -rw-r--r--. 1 root root 0 Oct  7 03:03 a.sh
    -rw-r--r--. 1 root root 0 Oct  7 03:09 3432_noname
    -rw-r--r--. 1 root root 0 Oct  7 03:09 334_noname
    -rw-r--r--. 1 root root 0 Oct  7 03:09 222_noname
    -rw-r--r--. 1 root root 0 Oct  7 03:09 123_noname
    -rw-r--r--. 1 root root 0 Oct  7 03:09 190_noname
    bash$>