Znajdź pliki o nazwach krótszych niż 7 znaków i zmień ich nazwę na nazwę pliku .new

-1

Znajdź pliki o nazwach krótszych niż 7 znaków i zmień ich nazwę na nazwę pliku .new

ls | grep -E "^.{,6}$"| xargs -I {} -t mv {} .new

bez pracy

Владимир Владимир
źródło
Przemianować wszystko z nich do .new ?
thrig
Wszystkie pliki w katalogu domowym
Владимир Владимир
Jeśli masz kilka pasujących plików, wszystkie powinny zostać przemianowane na „.new” (gwarantowane zderzenie nazw ...)?
xenoid

Odpowiedzi:

0

Za pomocą find z -regex:

... i zakładając, że pliki znajdują się w bieżącym katalogu (biorąc pod uwagę początkowe pytanie)

find -regextype egrep -regex '^.{1,6}$' -exec mv {} .new

Regexps in find zaakceptuj różne składnie, więc dobrze jest być wyraźnym. Również jeśli chcesz, zeskanuj kilka katalogów, zwróć uwagę, niż w przeciwieństwie do tego name, -regex odnosi się do całej ścieżki do pliku, a zatem będzie odpowiedni wzór łatania '.*/[^\]{1,6}'

xenoid
źródło
0

Biorąc pod uwagę, że pliki o nazwach 1-6 znaków nie są tymi z 7 lub więcej znakami:

mv !(???????*) .new

( ???????* dopasowuje nazwy 7 znaków lub więcej i !() neguje to). Ta odpowiedź zakłada, że ​​masz tylko jedno możliwe dopasowanie (które twoje pytanie wydaje się sugerować w obecnej formie).

Jeśli masz kilka dopasowań, użyj wzoru w a for pętla:

for f in !(???????*); do ... ; done
xenoid
źródło
To nie działa. 'mv' próbuje przenieść pliki do nieistniejącego katalogu o nazwie '.new'. Jestem pewien, że można to zrobić tylko za pomocą pętli for.
JosefScript
Początkowe pytanie jest dziwne, ponieważ jeśli i tak nie zadziałałoby, gdyby było kilka pasujących plików, to tylko pierwsza byłaby zmieniona. Chyba że PO sugeruje, że i tak będzie tylko jeden mecz, w takim przypadku to zadziała.
xenoid
OP powiedział „pliki”, co oznacza liczbę mnogą. Nie określił tego dokładnie, ale w moim rozumieniu stara się nadać tym plikom rozszerzenie ”. Nowy'. Dlaczego chcesz przenieść kilka plików do jednego ukrytego pliku?
JosefScript
0

Użyj pętli for i wzoru globbingowego w ten sposób: for file in !(???????*); do mv $file $file.new; done

Dzięki ksenoidowi za prawidłowy wzór globu.

JosefScript
źródło