Nowe posty

Autor Wątek: zmiana nazw listy plików  (Przeczytany 1242 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: 3066
  • 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