使用文件名命名变量

使用文件名命名变量

我有一个文件,其名称格式为Pocket_???_????_?.pdb_OUTPUT.txt????_?,目录格式为 ????_???。我需要复制其中的部分内容。例如,我有一个文件列表,我只想复制最终目录中的这个文件。

例如:

file.txt:

Pocket_001_1b47_A.pdb_OUTPUT.txt
Pocket_002_1b47_A.pdb_OUTPUT.txt
Pocket_001_2cl5_B.pdb_OUTPUT.txt
Pocket_001_4rtl_A.pdb_OUTPUT.txt

这些文件中的每一个都位于其自己的目录(1b47_A2cl5_B4rt1_A)中,我想进入每个目录并将它们复制到另一个目的地。问题是我不知道如何根据文件名指示目录。

我尝试使用这个脚本,这很好用,但它处理所有目录??????_?由于人数众多,因此需要很长时间。

for dir in ????_?; 
    do cd $dir/; 
       while read file; 
       do cp $file /home/tommaso/cp_file/; done < /home/tommaso/file.txt ; 
    cd .. ; cd .. ; done

我想告诉脚本仅在文件名中包含的目录中搜索文件。我怎样才能做到这一点?

答案1

这可能是一个选择:

while IFS= read -r file; do 
  dir="${file%%.*}"
  cp "${dir#*_*_}/$file" /home/tommaso/cp_file/
done < file.txt

答案2

您可以使用和一起awk打印:directory/filenamexargscp -t DIRECTORY SOURCE...

awk -F"[_.]"  '{printf "%s_%s/%s\n",$3,$4,$0}' file.txt \
| xargs -d '\n' cp -t /home/tommaso/cp_file/

相关内容