【问题标题】:Linux: Recreate parent directories when moving filesLinux:移动文件时重新创建父目录
【发布时间】:2021-10-29 04:06:15
【问题描述】:

在我的工作目录中,我有几个文件夹,其中包含数百个不同类型的文件(.txt、.csv、.png...)。这些文件夹的结构如下例所示:

myDir/
myDir/Folder_1/ ... file_1.txt, file_2.csv, file_3.txt
myDir/Folder_2/ ...
myDir/Folder_3/ ...
...

我需要将所有 .csv 文件移动到一个新目录,但要保持相同的目录树,如下所示:

myDir/
myDir/Folder_1/ ...
myDir/Folder_2/ ...
...
myDir/New/
myDir/New/Folder_1/ ... file_2.csv
myDir/New/Folder_2/ ...
...

我发现 cp 命令有 --parents 标志,可以做我想做的事情,但我不想复制这些文件,我只想移动它们。

我之前搜索过这个问题,找到了这个:Bash script for moving files and their parent directory

这与我需要做的非常相似,但我无法理解。

【问题讨论】:

  • 然后复制删除它们?
  • 我无法复制这些文件,原因有二:磁盘空间和执行时间。这就是我试图移动它们的原因。据我所知,在同一个磁盘(具有相同文件系统)的两个目录之间移动文件是一种即时操作,不需要创建副本
  • @MiguelHerreraRuiz,你可能需要rsync。它具有移动(不复制)到另一个目录的能力。它也是比 cp/scp 等更智能的命令,即使它在运行 rsync 命令(你第一次使用)时被取消(或以任何方式停止/杀死),它也会从最后开始移动/复制文件最后一次运行,因为它处理存储块级别的事情。它不是 bash 的默认实用程序,因此您可能需要安装它以防它未安装在您的系统中。
  • 好的,我会尝试使用 rsync 移动它们
  • @MiguelHerreraRuiz,在将它们运行到实际目录之前,请小心并针对单个测试左右的目录对其进行测试。

标签: linux bash shell directory mv


【解决方案1】:

检查以下 sn-p 打印出来的命令。如果他们按照您的意愿行事,则只需删除 echo(在 mkdirmv 之前)。

for path in myDir/*; do
  [[ -d "$path" ]] && echo mkdir -p "myDir/New/${path#myDir/}"
done

for csv in myDir/*/*.csv; do
  echo mv "$csv" "myDir/New/${csv#myDir/}"
done

【讨论】:

  • 效果很好。谢谢!!我认为这个任务可以使用一行 bash 命令来解决。
  • 每个目录调用一次mv而不是每个文件调用一次可以提高效率。至于单行,你可以这样输入,但问题是带有分号的东西是否仍然算作单行。 ?
猜你喜欢
  • 2012-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多