BASH:根据dirname移动文件

时间:2017-12-16 01:41:59

标签: bash for-loop

我想将许多已处理的文件从其原始目录移动到新目录。每个目录名称对应,但只有两个数字;其余的目录名称是不同的。如何在for循环中定义一个模式,以便轻松地在相应的目录中查找和移动这些文件?

更多细节: 我有两组90个目录。第一组包含原始文件,第二组是我想移动相应的gzip文件的地方。问题是第一组和第二组目录只共享其名称的一部分:第一组是ABC_1##;第二个是##YY00ZZ(例如:原始目录ABC_123对应于新目录23yy00zz。有一个复杂但必要的原因,他们必须遵循这种格式)。 gzip文件都被赋予相同的名称(我们称之为FILE.gz),但最重要的是必须从原始目录23到新目录23 ......

这是我尝试过的,它对我不起作用(使用cp而不是mv,以免混乱太多):

for dir in $(ls -d ~/path/to/raw/ABC_1{01..90}/EACH_RAW_DIR); do
    dir2=$(ls -d ~/path/to/new/{01..90}yy00zz/EACH_NEW_DIR)
    echo $dir
    echo $dir2
    cp -r $dir/FILE.gz $dir2/.
done

感谢您的任何见解!

2 个答案:

答案 0 :(得分:1)

shell扩展不会使用填充零来展开{01..90}。它将它扩展为1,2,3,...,11,12,...,90。最好分两步完成:1)首先ABC_10{1..9} 2)ABC_1{10..90}

或者您可以使用seq -w 90

一旦你处理了这个,你只需要这样复制:

for i in "$(seq -w 90)"; do
      cp ~/path_to_raw_dir/ABC_1"$i"/file.gz ~/path_to_new_dir/"$i"yy00zz/file.gz
done

答案 1 :(得分:1)

您可以使用{101..190}范围并根据需要删除第一个数字:

for i in {101..190}; do
      cp ~/path_to_raw_dir/ABC_$i/file.gz ~/path_to_new_dir/${i:1}yy00zz/file.gz
done