用于移动文本文件中列出的目录中的文件的 Bash 脚本

用于移动文本文件中列出的目录中的文件的 Bash 脚本

我有这样的目录结构。

.
├── Round_1_Div2
│   ├── file1.txt
│   └── file2.txt
├── Round1Div2
│   ├── file3.txt
│   └── file4.txt
├── Round_2_Div2
│   ├── file1.txt
│   └── file2.txt
└── Round2Div2
    ├── file3.txt
    └── file4.txt

我需要将所有文件从第1轮第2轮Round_1_Div2回合2分区2Round_2_Div2

根据我的一点知识

  find *ound[0-9]Di* > rename.txt
  sed  -e 's/ound/ound_/;s/Di/_Di/' < rename.txt > newname.txt

重命名.txt名字.txt运行上述命令后创建

重命名.txt

Round1Div2
Round2Div2

新名称.txt

Round_1_Div2
Round_2_Div2

如何将每个 like 中指定的目录中的所有文件移动到 of重命名.txt到对应的目录下新名称.txt??谢谢。

答案1

使用 perlrename实用程序(也称为prenamefile-rename):

$ rename -n 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
rename(Round1Div2/file3.txt, Round_1_Div2/file3.txt)
rename(Round1Div2/file4.txt, Round_1_Div2/file4.txt)
rename(Round2Div2/file3.txt, Round_2_Div2/file3.txt)
rename(Round2Div2/file4.txt, Round_2_Div2/file4.txt)

-n选项使其成为一次试运行,因此它仅显示其内容做而不是真正去做。当您确定它将执行您想要的操作时,请删除-n(仅重命名文件,没有任何进度显示或其他输出)或将其替换-v为详细输出:

$ rename -v 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
Round1Div2/file3.txt renamed as Round_1_Div2/file3.txt
Round1Div2/file4.txt renamed as Round_1_Div2/file4.txt
Round2Div2/file3.txt renamed as Round_2_Div2/file3.txt
Round2Div2/file4.txt renamed as Round_2_Div2/file4.txt

答案2

使用类似的东西似乎最简单

mv -i Round1Div2/* Round_1_Div2 && rmdir Round1Div2
mv -i Round2Div2/* Round_2_Div2 && rmdir Round2Div2

如果存在名称冲突,-i选项mv应该会给您一个交互式提示,询问您是否要覆盖该文件。

如果您有隐藏文件名,或者数千文件,那么您可能想使用rsync

rsync -av --ignore-existing Round1Div2/ Round_1_Div2
rsync -av --ignore-existing Round2Div2/ Round_2_Div2

请注意,/源目录名称末尾的 是故意的。这将在目标目录下重新创建源目录的文件层次结构,并且不会覆盖现有数据。源目录将保留在原处(所以这副本而不是移动,除非您还添加了选项--remove-source-files)。

答案3

我会用mv -S dup folder1/* folder2

您可以与asmv交互使用-i其他答案建议。或者你可以使用-S --后缀=后缀。这意味着如果 file.txt 已经存在,那么新位置的该文件将被重命名为 file.txtdup(使用 -S dup)。

使用awk

因为文本文件中列出了目录。以下 awk 命令可用于此目的:

awk '{ printf "mv -S dup %s/* ", $0 ; getline < "newname.txt"; printf "%s\n", $0 }' rename.txt

相关内容