Mam wiele katalogów:

13R
613
AB1
ACT
AMB
ANI

Każdy katalogi zawiera dużo pliku:

20140828.13R.file.csv.gz
20140829.13R.file.csv.gz
20140830.13R.file.csv.gz
20140831.13R.file.csv.gz
20140901.13R.file.csv.gz

20131114.613.file.csv.gz
20131115.613.file.csv.gz
20131116.613.file.csv.gz
20131117.613.file.csv.gz

20141114.ab1.file.csv.gz
20141115.ab1.file.csv.gz
20141116.ab1.file.csv.gz
20141117.ab1.file.csv.gz

etc..

Cel, jeśli chcesz mieć pierwszy plik z każdego katalogów

Wynikiem tego, czego oczekuję:

13R|20140828
613|20131114
AB1|20141114

Jaka jest nazwa katalogów rurowa data nazwy pliku. Myślę, że potrzebuję znajomości i głowy komendy + awk, ale nie mogę tego zrobić, potrzebuję twojej pomocy.

Tutaj to, co go testuję

for f in $(ls -1);do ls -1 $f/ | head -1;done

Ale brakuje nazwy folderu.

Kiedy mam na myśli pierwszy plik, jest pierwszym plikiem zwróconym w kolejności alfabetycznej w folderze.

Dzięki.

0
Seth 15 luty 2017, 18:46

3 odpowiedzi

Najlepsza odpowiedź

Możesz to zrobić za pomocą pętli bash.

Dany:

/tmp/test
/tmp/test/dir_1
/tmp/test/dir_1/file_1
/tmp/test/dir_1/file_2
/tmp/test/dir_1/file_3
/tmp/test/dir_2
/tmp/test/dir_2/file_1
/tmp/test/dir_2/file_2
/tmp/test/dir_2/file_3
/tmp/test/dir_3
/tmp/test/dir_3/file_1
/tmp/test/dir_3/file_2
/tmp/test/dir_3/file_3
/tmp/test/file_1
/tmp/test/file_2
/tmp/test/file_3

Po prostu pętla przez katalogi i tworzą tablicę z globu i złap pierwszy:

prefix="/tmp/test"
cd "$prefix"
for fn in dir_*; do 
    cd "$prefix"/"$fn"
    arr=(*)
    echo "$fn|${arr[0]}"
done

Wydruki:

dir_1|file_1
dir_2|file_1
dir_3|file_1

Jeśli twoja definicja "pierwszego" jest inna, że bash jest po prostu posortuj tablicę arr zgodnie z definicją przed rozpoczęciem pierwszego elementu.


Możesz również to zrobić za pomocą find i awk:

$ find /tmp/test -mindepth 2 -print0 | awk -v RS="\0" '{s=$0; sub(/[^/]+$/,"",s); if (s in paths) next; paths[s]; print $0}'
/tmp/test/dir_1/file_1
/tmp/test/dir_2/file_1
/tmp/test/dir_3/file_1

I włóż sort (lub użyj {x1}}), aby sortować zgodnie z potrzebami

2
dawg 15 luty 2017, 22:45

sort ma wyjątkową opcję. Tylko katalog powinien być unikalny, więc użyj pierwszego pola w sortowaniu -k1,1. Rozwiązanie działa, gdy lista plików jest już sortowana.

printf "%s\n" */* | sort -k1,1 -t/ -u | sed 's#\(.*\)/\([0-9]*\).*#\1|\2#'

Będziesz musiał zmienić polecenie sed, gdy polecenie daty może następować inny numer.

2
Walter A 16 luty 2017, 22:33

To działa dla mnie:

for dir in $(find "$FOLDER" -type d); do
  FILE=$(ls -1 -p $dir | grep -v / | head -n1)
  if [ ! -z "$FILE" ]; then
    echo "$dir/$FILE"
  fi
done
0
Manuel Schmitzberger 27 lipiec 2020, 17:22