Skrypt wyszukujący ostatnio utworzony/zmodyfikowany katalog


(Kurt_Hectic) #1

Potrzebuję stworzyć skrypt, który w katalogu gdzie zostanie uruchomiony, znajdzie ostatnio utworzony/zmodyfikowany podkatalog i przekaże go jako argument do polecenia.
Nigdy nie pisałem skryptów w bashu i zastanawiam się, od której strony to “ugryźć”. Na pewno wychodzę od plecenia
ls -lt
dalej tylko się domyślam, że trzeba by użyć polecenia grep, chociaż podejrzewam, że awk będzie lepszym wyjściem. Niestety nie mam za bardzo pomysłu jak do prawidłowo użyć.


(Superkasmir) #2

ls -td $HOME/* | head -n 1

to powinno działać $HOME to katalog domowy możesz zmienić na dowolny

a skrypt

#!/bin/bash

if [ "${1}" = "" ]; then
 echo "Skrypt wymaga podania ścieżki gdzie będzie wyszukiwanie np /home/user"
 exit 1
fi
ls -td ${1}/* | head -n 1

np.
[user@localhost]$ ./find.sh
Skrypt wymaga podania ścieżki gdzie będzie wyszukiwanie np /home/user
[user@localhost]$ ./find.sh /home/user
/home/user/Muzyka

teraz utworze plik w innym katalogu Pobrane

[user@localhost ]$ touch /home/user/Pobrane/plik-nowy
[user@localhost Muzyka]$ ./find.sh /home/user
/home/user/Pobrane


(roobal) #3

Grep czy awk niekoniecznie. Jeśli kolega potrzebuje tylko nazwę katalogu, to trzeba by użyć polecenia basename.

Ostatnia linia wówczas wyglądałaby tak:

basename $(ls -td ${1}/* | head -n 1)

(Kurt_Hectic) #4

Dziękuję za szybką odpowiedź. Skrypt działa idealnie, tylko zastanawiam się, jak taki sam efekt uzyskać w przypadku gdy w katalogu, który ma przeszukać skrypt znajdą się jakieś pliki. Bo nadal interesuje mnie “najmłodszy” katalog.
Gdy zastosuję skrypt w katalogu, w którym są podkatalogi i pliki, a plik będzie miał nowszą datę utworzenia/modyfikacji, to jako efekt działania skryptu otrzymam nazwę tego pliku. Chociaż użycie ls -d powinno wyświetlić tylko same katalogi, ale użycie w bieżącym katalogu powoduje wyświetlenie jako wyniku, pojedynczej kropki.


(roobal) #5

Nie wykonuj polecenia wewnatrz katalogu.

ls -d katalog


(marcin82) #6

I ty możesz zostać druciarzem :stuck_out_tongue_winking_eye:

find /ścieżka/* -type d -printf "%T@ %Tc %p\n" | sort -rn | awk 'NR==1{print $7}'

Na podstawie:


https://linux.die.net/man/1/find

Przykład:
[RODO@RODO ~]$ find ~/Pulpit/* -type d -printf "%T@ %Tc %p\n" | sort -rn | awk 'NR==1{print $7}'
/home/RODO/Pulpit/test3

[RODO@RODO ~]$ tree -d Pulpit
Pulpit
├── test1
├── test2
└── test3

3 directories


(Superkasmir) #7

root@user:~# mkdir -p test test1 test2
root@user:~# touch test1/plik
root@user:~# ./find.sh .
./test1
root@user:~# cd test1
root@user:~/test1# mkdir test2
root@user:~/test1# …/find.sh .
./test2
root@user:~/test1# pwd
/root/test1
root@user:~/test1/test2# pwd
/root/test1/test2

czyli najmłodszy katalog znajduje i nic więcej nie potrzeba