Potrzebuję polecenia, aby zmienić nazwę wszystkich plików w bieżącym katalogu roboczym, tak aby nowa nazwa pliku była taka sama jak stara, ale zawiera sufiks odpowiadający liczbie wierszy oryginalnych plików (np. Jeśli plik f
ma 10 wiersze, należy zmienić jego nazwę na f_10
).
Oto moja (niedziałająca) próba:
linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
bash
batch-rename
Martin Yeboah
źródło
źródło
Odpowiedzi:
Co powiesz na:
Na przykład:
Jeśli chcesz zachować rozszerzenia (jeśli są obecne), użyj tego zamiast:
źródło
_
. Co do skryptu, jaki skrypt? To powinno być uruchamiane z linii poleceń, nie ma potrzeby tworzenia skryptu. Jeśli chcesz, aby pasował tylko do niektórych plików, zmień nain *
, na przykład,in *txt
lub coś.wc -l < $f
zamiast grep byłoby łatwiej zrozumieć (i może lepiej wykonać, ale tego nie sprawdziłem).wc
, chciałem pokazać inne podejście. Ale OK, w porządku.Możesz wypróbować ten jeden liner:
To znajdzie wszystkie pliki w bieżącym katalogu roboczym (
find . -maxdepth 1 -type f
)Następnie uruchamiamy instancję powłoki nad znalezionymi plikami, aby zmienić nazwy plików, aby dodać liczbę wierszy.
Przykład:
źródło
Innym sposobem, który zachowuje rozszerzenie (jeśli jest obecne) przy użyciu
rename
:Jeśli wynik jest oczekiwany, usuń
-n
opcję:źródło
rename
świetnie =) +1(\.?[^\.]+)
.(\.?[^\.]+)
nie jest to w porządku, ponieważ będzie pasować tylko do drugiej kropki i nie będzie pasować do nazwy pliku z kolejnymi kropkami lub niezależnie od końcówki. To nie jest łatwe rozwiązanie trudne, jedynym sposobem wydaje się zrobić dwie zmiany..
wewnątrz klas postaci.Używanie
find
:Przykład
źródło
-name "*"
? Resztki z testów? ;)Tylko dla zabawy i chichocze rozwiązanie
rename
. Ponieważrename
jest to narzędzie Perla, które akceptuje dowolny ciąg znaków, który jest ewaluowany, możesz wykonywać różnego rodzaju shenanigany. Rozwiązanie, które wydaje się działać, jest następujące:źródło
Poniższy skrypt dotyczy wielu przypadków: pojedynczej kropki i rozszerzenia (file.txt), wielu kropek i rozszerzeń (file.1.txt), kolejnych kropek (file..foobar.txt) oraz kropek w nazwie pliku (pliku. Lub plik..).
Scenariusz
Skrypt w akcji
Zauważ, że w pliku nie ma linii. i plik .., stąd liczba wierszy wynosi 0
Specjalne podziękowania dla terdona i Helio za przejrzenie skryptu i sugerowane zmiany
źródło
Kolejny bash, opracowany z @Helio na czacie :
Dziwnie wyglądający monoklowany facet z karłowatą drugą głową (
(.*)(\.[^.]+)$
) powinien pasować tylko do odpowiednich przedłużeń (.foo
, nie..
). Jeśli nie ma rozszerzenia,BASH_REMATCH
tablica będzie pusta. Możemy to wykorzystać, używając domyślnej wartości nazwy pliku${BASH_REMATCH[1]:-$file}
i używając rozszerzenia w takiej postaci, w jakiej jest.Do obsługi plików kropek można użyć
find
, jak sugerują terdon i Helio .źródło