【问题标题】:Copy files between folders on linux在linux上的文件夹之间复制文件
【发布时间】:2019-01-03 23:18:47
【问题描述】:

我必须从不同的文件夹复制许多文件。

  1. 不知道源文件夹中有多少个
  2. 知道文件夹与包含的文件同名
  3. 只需要复制包含某些文件扩展名的文件夹

源文件夹结构示例

源文件夹结构如下

root
 - folder1
    - folder1.txt
 - folder2
    - folder2.csv
 - folder3
    - folder3.txt

目标文件夹结构示例

目标文件夹应该是这样的结构

root
 - folder1
    - folder1.txt
 - folder3
    - folder3.txt

为了完成通用复制和重新创建文件夹结构,我使用了以下脚本:

cp src/**/*.txt dest/
for file in $(ls *.txt); 
   do mkdir -p source/${file%.*}/ && mv $file dest/${file%.*}/; 
done

首先我复制目标文件夹中的所有文件。基于每个文件都在同名文件夹中的假设,然后我正在移动文件以重新创建原始结构。这个脚本有效地工作得很好。

现在要求已更改为支持多级文件夹结构。例如

root
 - folder1
    - folder11
       - folder11.txt
 - folder2
    - folder2.csv
 - folder3
    - folder3.txt

如何调整脚本以保持通用性?

【问题讨论】:

  • 您可以将源文件夹封装到一个数组中,并在该数组的循环中调整您的脚本。
  • 有什么理由不使用rsync?这似乎对我有用(模仿你的结构,而不是复制空的结构)。 rsync -av --include='*.*' --prune-empty-dirs lorenzo/src/ lorenzo/dst
  • 顺便说一句,mickp 的回答很好地遵循了相关的最佳实践——考虑对其进行模式化,尤其是使用 shell globbing 而不是ParsingLs,并注意引用所有扩展. (如果您通过shellcheck.net 运行您的原始代码,请考虑阅读从它抛出的警告链接的wiki 页面,特别是SC2045SC2086)。

标签: linux shell sh


【解决方案1】:

这可能对你有用:

#!/usr/bin/env bash

shopt -s globstar

src=some/src/path
dest=some/dest/path

for f in "$src"/**/*.txt; do
    d=${f#"$src"} d=$dest/${d%/*}
    mkdir -p -- "$d" || continue
    cp -- "$f" "$d"
done

【讨论】:

  • 我相信你不需要 shopt 来处理文件。
  • @Gox 你需要它来进行递归通配**
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2017-06-17
相关资源
最近更新 更多