Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: zmiana nazw listy plików  (Przeczytany 1209 razy)

visioner76

  • Gość
zmiana nazw listy plików
« dnia: 2015-05-13, 09:38:00 »
witam,
mam problem z utworzeniem skryptu, który zmieniałbym nazwy plików. dokładniej chce zrobić tak, ale w danym folderze zmienić wszystkie nazwy plików w formacje datatime jego utworzenia

plik1.txt (creation time 01-02-2015)
plik2.txt (creation time 02-03-2015)

wynik:

01022015.txt
02032015.txt

dzieki z góry za pomoc

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
zmiana nazw listy plików
« Odpowiedź #1 dnia: 2015-05-13, 11:50:58 »
Po pierwsze raczej nie dostaniesz się w prosty sposób do czasu utworzenia pliku:
http://unix.stackexchange.com/questions/91197/how-to-find-creation-date-of-file#91200

Załóżmy więc, że wystarczy ci czas ostatniej modyfikacji:
#!/bin/bash
while read plik; do
  plik2=$(date -d "@$(stat -c '%Y' $plik)" +"%Y%m%d.txt")
  echo mv "$plik" "$plik2"
done < <(find . -maxdepth 1 -type f -name '*.txt')
Po drugie w ten sposób prosisz się o nadpisanie plików powstałych (zmienionych) w tym samym dniu.

Po trzecie, jeśli nie masz ważnych powodów, daty w nazwie pliku powinny być w kolejności rok-miesiąc-dzień, aby standardowe sortowanie plików zwracało sensowny ich układ.

arturm

  • Gość
zmiana nazw listy plików
« Odpowiedź #2 dnia: 2015-05-13, 12:59:58 »
może coś takiego:

find $PWD -type f | xargs stat -c %x,%n  | awk '{print $1,$2,$3}' |  perl -e 'while(<>){/(\\d+?)-(\\d+?)-(\\d+?)\\s(\\d+?):(\\d+?):(\\d+?)\\..*?,(.+$)/; $filpth=$7; $filenam="$1$2$3$4$5$6\\.txt"; $filpth=~/(.*\\/)/;`mv "$filpth" "$1$filenam"`}'

Włacznie z sekundami i minutami.


W szczególności %x na %y trzeba  by tu zmienić.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
zmiana nazw listy plików
« Odpowiedź #3 dnia: 2015-05-13, 15:00:57 »
1. Nowe systemy plików już nie trzymają daty utworzenia. Masz dostępne modyfikacji i dostępu (jak to ostatnie nie jest zablokowane przez noatime). Wróć, trzymają, tylko nie ma API do odczytu.

2. date -r PLIK zwraca datę modyfikacji sformatowaną jak chcesz, wynik jest ten sam co do wartości co dla stat --format=%y, ale w przeciwieństwie do stat możesz ustalić własny format daty.

3 Całość wygląda tak:
for FILE in *.txt ; do mv "$FILE" $(date -r "$FILE" '+%d%m%Y').txt ; done
Lub w wersji poprawionej (m. in z sugestią kolegi ultr-a)

for FILE in *.txt ; do mv --backup=t "$FILE" $(date -r "$FILE" '+%Y%m%d').txt ; done
Po pierwsze data jest rozsądniejsza do sortowania, po drugie nie robi rzeźni w plikach z tego samego dnia. Pierwszy się nazywa normalnie, kolejne mają przyrostki ~1~, ~2~, itd.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy