зацикливание файлов внутри каталогов - PullRequest
0 голосов
/ 31 марта 2020

У меня есть каталоги с именем 1, 2 and 3,, каждый из которых содержит файл с именем OSZICAR. Я хочу создать файл для построения графика в gnuplot с 1-м столбцом в качестве имен каталогов [1 2 3] и вторым столбцом в качестве символов из последней строки файла OSZICAR. Я пробовал следующий код `

for d in */;do

    echo "$d">>1.txt

done

# to avoid the slash and get 1 2 3 values only
cut -c -1,3 1.txt >2.txt

for d in */;do

    cd $d | tail -n 1 OSZICAR | cut -c9-22>3.txt

done

paste 2.txt 3.txt > gnu.text

Но я получаю, что последняя строка OSZICAR копируется только из одного каталога (с именем 1), а не из других каталогов (2 и 3).

Может кто-нибудь предложить ответ

Ответы [ 3 ]

0 голосов
/ 31 марта 2020

Лучший способ сделать это - использовать команду find.

Попробуйте это

find . -type f  -name   OSZICAR  -exec tail -n 1 {} ';' | cut -c9-22

Объяснение:

find 
.  <--  Means current directory  
-type f <--- Should be file 
 -name   OSZICAR <--  File name should be OSZICAR  
-exec <--  Execute command on output of find  
tail -n 1 
{} ';' <-- ; tells where command is ending  
| cut -c9-22
0 голосов
/ 31 марта 2020

Вы можете попробовать сделать их все в одном l oop.

#!/usr/bin/env bash

directories=({1..3}/)

for d in "${directories[@]}"; do
  if [[ -f ${d}OSZICAR ]]; then
    chars=$(tail -n1 "${d}OSZICAR" | cut -c9-22)
    printf '%s\t %s\n' "${d%/*}" "$chars"
  fi
done > gnu.text
0 голосов
/ 31 марта 2020

Не нужно CD; также перенаправить за пределы l oop:

for d in */;do

    tail -n 1 $d/OSZICAR | cut -c9-22

done >3.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...