BASH:根据dirname移动文件

问题描述 投票:1回答:2

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

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

感谢您的任何见解!

bash for-loop
2个回答
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
投票

您可以使用一系列{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
© www.soinside.com 2019 - 2024. All rights reserved.