我想将许多已处理的文件从其原始目录移动到新目录。每个目录名称对应,但只有两个数字;其余的目录名称是不同的。如何在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
感谢您的任何见解!
答案 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