【问题标题】:BASH: move files according to dirnameBASH:根据目录名移动文件
【发布时间】:2017-12-16 01:41:58
【问题描述】:

我想将一些已处理的文件从它们的原始目录移动到一个新目录。每个目录名称对应,但只有两个数字;其余的目录名称不同。如何在 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

感谢您的任何见解!

【问题讨论】:

  • “EACH_RAW_DIR”和“EACH_NEW_DIR”是实际目录吗?您能否举一个完整的 mv 命令示例,该命令需要移动其中一个文件?

标签: bash for-loop


【解决方案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

【讨论】:

  • 在bash 4 或更高版本中,{01..90} 将扩展为00, 01, 02, ..., 90。
  • 另外,引用"$(seq -w 90)" 只会在很长的参数(所有数字)上循环一次!
【解决方案2】:

您可以使用{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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2017-03-09
    • 2018-04-10
    相关资源
    最近更新 更多