我在不同的嵌套目录中有一些文件。所有文件均命名为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
. - 如果尝试将文件移动到已存在的名称,则会要求确认
-i
。mv
- 应该
--
保护您免受以下开头的争论-
。这不应该是问题,因为$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
.