将嵌套目录中的特定文件递归移动到从路径派生的名称

将嵌套目录中的特定文件递归移动到从路径派生的名称

我在不同的嵌套目录中有一些文件。所有文件均命名为Analysis.mzXML.我希望将它们全部放在一处,同时根据之前保存的目录将每个名称更改为不同的名称。

我知道移动文件并为其指定目录名称已在其他问题中显示过,例如,

然而,他们仅使用程序将其移出一个目录,并且仅根据该目录更改名称。就我而言,我希望使用嵌套目录的整个路径来重命名文件

文件全部保存如下:

/dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML

每个都Analysis.mzXML嵌套在不同名称的文件夹中。然而,dir6所有文件碰巧具有相同的名称,并且由于它没有提供有价值的信息,我想跳过它。

我的期望是,通过运行一些命令或脚本,我可以获得所有这些文件,并以其特定路径命名,如下所示:

/dir1_dir2_dir3_dir4_dir5.mzXML

我刚刚开始使用 bash,我不知道如何解决这个问题。

答案1

正如所写的,您的问题表明您想要在整个文件系统中搜索Analysis.mzXML文件,即使它们出现在/lib/perl5/5.14/Unicode/Collate/Locale/proc/sys/net/ipv4/conf/all/sys/devices/system/cpu/cpu0/cache/usr/share/doc/cmake/html/_sources或类似不太可能/不适当的位置 - 并且您想要将文件移动到根目录中,这也似乎不太可能/不合适。我假设您正在其他目录中工作。

运行这个命令:

find . -mindepth 7 -maxdepth 7 -type f -name Analysis.mzXML -exec sh -c 'for arg do echo mv -i -- "$arg" "$(echo "$arg" | sed -e "s|^\./||" -e "s|/dir6/Analysis\.mzXML|.mzXML|" -e "s|/|_|g")"; done' sh {} +

-mindepth 7 -maxdepth 7 如果您确定所有Analysis.mzXML文件都位于第七层,则可以省略。此命令查找Analysis.mzXML第七层的所有文件并将它们传递给迷你 shell 脚本。这会获取每个路径名,去掉./开头和dir6结尾的 以及Analysis文件名的一部分,并将所有剩余/字符更改为_.这应该产生如下输出:

mv -i -- ./dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML dir1_dir2_dir3_dir4_dir5.mzXML
mv -i -- ./the/quick/brown/fox/jumps/dir6/Analysis.mzXML the_quick_brown_fox_jumps.mzXML
mv -i -- ./over/the/lazy/dog/foo bar/dir6/Analysis.mzXML over_the_lazy_dog_foo bar.mzXML

如果这看起来正确,请再次运行该命令,但删除第一个命令echo(即更改echo mv为 just mv)。

笔记:

  • 这并不能验证第六级目录是否实际被调用dir6。如果它Analysis.mzXML在 中找到文件dir11/dir12/dir13/dir14/dir15/dir16,它将将该文件重命名为 ,dir11_dir12_dir13_dir14_dir15_dir16_Analysis.mzXML 而不是dir11_dir12_dir13_dir14_dir15.mzXML.
  • 如果尝试将文件移动到已存在的名称,则会要求确认-imv
  • 应该--保护您免受以下开头的争论-。这不应该是问题,因为$arg应该始终以 开头./
  • 如果您确实想从文件系统根目录执行此操作,那么应该可以。只需cd /按照上述说明操作即可。

事后思考:如果您有一个名为 的目录,这可能会失败Analysis.mzXML。所以不要这样做。

答案2

如果您仅使用 移动一个文件mv,则指定源文件名,然后指定目标文件名或者目标目录(如果您希望它在不同的目录中具有相同的名称)。例如

mv /path/to/Analysis.mzXML /new/directory/new-filename.mzXML

或(在新目录中保留相同的文件名):

mv /path/to/Analysis.mzXML /new/directory/

如果您要移动多个文件,则目标必须是一个目录。例如

 mv /path/to/*.mzXML /new/directory/

如果您想复制一个或多个文件(使用cp而不是mv.

相关内容