使用文本文件重命名文件和文件夹

使用文本文件重命名文件和文件夹

我正在尝试使用以空格分隔的文本文件重命名文件和目录。

文件.txt看起来像这样:

dir1-1 dir1_1
dir2-1 dir223_1

我的命令如下:

xargs -r -a **files.txt** -L1 mv

这些文件如下所示(在目录 1 中):

dir1-1.txt dir1-1.gzip dir1-1-something.text

文件的输出应如下所示(在 dir1-1 中):

dir1_1.txt dir1_1.gzip dir1_1-something.text

目录 (dir2) 中的文件如下所示:

dir2-1.py dir2-1.txt dir2-1.text

输出应如下所示:

dir223_1.py dir223_1.txt dir223_1.text

此命令只能将文件夹从 dir1-1 重命名为 dir1_1,将 dir2-1 重命名为 dir223_1so,但不会重命名子目录中的文件。相应目录下的文件也有这些目录的前缀。 (如 dir1-1.txt dir1-1.gzip dir1-1.csv)

它有点类似: 使用包含备用文件名的文本文件重命名文件的脚本

期待您的帮助。

答案1

有很多方法可以做到这一点,但这里有一个非常简单直接的示例来说明一种方法:

$ cat files.txt 
dir1-1 dir1_1
dir2-1 dir223_1

$ cat rename.sh
#!/bin/bash

# make some dirs and files to test with:
d='dir1-1'; mkdir "$d"; for ext in .txt .gzip -something.txt; do touch "$d/$d$ext" ; done
d='dir2-1'; mkdir "$d"; for ext in .py .txt .text; do touch "$d/$d$ext" ; done

# now rename them:
while read -r old new ; do
  # rename the directory too
  mv -v "$old" "$new"

  # and rename the files
  if [ -d "$new" ] ; then
    for f in "$new/"* ; do
      mv -v "$f" "$(printf "%s" "$f" | sed -e "s/$old/$new/g")"
    done
  fi
  echo
done < files.txt

$ chmod +x rename.sh

$ ./rename.sh 
renamed 'dir1-1' -> 'dir1_1'
renamed 'dir1_1/dir1-1.gzip' -> 'dir1_1/dir1_1.gzip'
renamed 'dir1_1/dir1-1-something.txt' -> 'dir1_1/dir1_1-something.txt'
renamed 'dir1_1/dir1-1.txt' -> 'dir1_1/dir1_1.txt'

renamed 'dir2-1' -> 'dir223_1'
renamed 'dir223_1/dir2-1.py' -> 'dir223_1/dir223_1.py'
renamed 'dir223_1/dir2-1.text' -> 'dir223_1/dir223_1.text'
renamed 'dir223_1/dir2-1.txt' -> 'dir223_1/dir223_1.txt'

注意:因为您的files.txt文件和目录名称有一个空格分隔新旧模式,而且因为我使用read默认的 IFS 设置$' \t\n'(空格、制表符或换行符),所以以下脚本将适用于任何文件名模式中不包含这些字符(或 a/因为它被用作 中的分隔符sed)。

相关内容