在Linux上的文件夹之间复制文件

时间:2019-01-03 23:18:48

标签: linux shell sh

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

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

源文件夹结构示例

源文件夹具有以下结构

{'66': 74, '62': 32, '69': 18, '72': 14, '64': 37, '192': 60, '51': 70, '46': 42, '129': 7, '85': 24, '83': 73, '65': 14, '87': 28, '185': 233, '171': 7, '176': 127, '89': 42, '80': 32, '5':
54, '93': 56, '104': 53, '138': 7, '162': 28, '204': 28, '79': 46, '178': 60, '144': 21, '90': 136, '193': 42, '88': 52, '212': 22, '199': 35, '198': 21, '149': 22, '84': 82, '213': 49, '47': 189, '195': 46, '31': 152, '71': 21, '70': 4, '207': 7, '158': 14, '109': 7, '163': 46, '142': 14, '94': 14, '173': 11, '78': 7, '134': 7, '96': 7, '128': 7, '54': 14, '63': 4, '120': 28, '121': 7, '37': 22, '13': 7, '45': 14, '23': 10, '180': 7, '50': 14, '188': 35, '24': 7, '139': 18, '148': 12, '151': 4, '2': 18, '34': 4, '77': 32, '81': 44, '82': 11, '92': 19, '95': 29, '98': 7, '217': 21, '172': 14, '35': 148, '146': 7, '91': 21, '103': 21, '184': 28, '165': 7, '108': 7, '112': 7, '118': 7, '159': 7, '183': 7, '186': 7, '205': 7, '60': 7, '67': 7, '76': 7, '86': 7, '209': 7, '174': 7, '194': 1}

目标文件夹结构示例

目标文件夹应类似于以下结构

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

如何使脚本保持通用?

1 个答案:

答案 0 :(得分:3)

这可能对您有用:

#!/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