Mam nieszczęście pochodzić ze środowiska MS-DOS - ale przynajmniej to sprawia, że doceniam, jak potężniejszy jest Linux. Pracowałem nad tym, aby mój Linux-Fu osiągnął najwyższy poziom, ale jest kilka rzeczy, które można zrobić z DOS-em, ale nie jestem pewien, jak najłatwiej to zrobić z Linuksem:
Zmienianie nazw wielu plików - za pomocą dwóch symboli wieloznacznych
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\>rename *.txt *.bak
c:\> dir
Directory of c:\
file1.bak
file2.bak
file3.bak
file4.bak
Wiem, że mógłbym find -exec
tutaj użyć , ale można użyć krótszej składni - być może mv
ze specjalnymi flagami lub składnią? Wydaje mi się, że kluczem do tego jest drugi *
symbol wieloznaczny, ponieważ linux nie powinien mieć problemu z pierwszym (tzn. Wiem, jak wybrać pliki, których nazwę chcę zmienić za pomocą symboli wieloznacznych)
Zmiana nazwy pojedynczego pliku - za pomocą jednego symbolu wieloznacznego
c:\> dir
Directory of c:\
file1.txt
c:\>rename file1.txt *.bak
c:\> dir
Directory of c:\
file1.bak
Byłoby to szczególnie pomocne przy zmianie nazwy długich i nieporęcznych nazw plików. Pomyślałem, że może przydałbym się mv file1.txt $1.bak
do tego, file1.txt.bak
co też byłoby akceptowalne, ale nie jestem pewien, czy można odwołać się do $1
parametru w linii za pomocą polecenia powłoki. Ponownie w tym konkretnym przypadku jest po prostu wygodne, jak ms-dos potępia *
znak wieloznaczny, który ma być używany jako rodzaj dopasowania przechwytywania / zamiany dla części nazwy pliku.
Filtrowanie list katalogów za pomocą symboli wieloznacznych
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
text.txt
\temp (directory)
c:\> dir file*
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\> t*
Directory of c:\
text.txt
\temp (directory)
Nie jestem pewien, jaka jest właściwa składnia do robienia tego ls
, ani czy jest to w ogóle możliwe. Jeśli zrobię coś takiego, ls t*
to od razu przejdzie do katalogów t
. Moje obejście albo było używane, find . --max-depth 1 -iname "t*"
albo coś w tym rodzaju ls -al | grep t
- żadne z nich nie jest tak krótkie i proste, jak dir t*
jest.
W końcu wiem, że mogę skonfigurować aliasy, aby skrócić te długie polecenia, ale chciałbym nauczyć się gotowego linux-fu do robienia tych rzeczy, ponieważ czasami jesteś podłączony do zdalnego systemu lub pracujesz na nowej maszynie.
Więc jak mogę mv
i ls
pliki w taki sam sposób, jak kiedyś dir
i rename
pliki?
źródło
somefunc *.Ext
jeśli ten wzorzec nie pasuje do żadnego pliku, i baw się cytowaniem, aby sprawdzić, czy uda ci się przekazać wzór ( bez rozszerzania) między funkcjami. Wskazówka bezpieczeństwa: nie używajrm
nigdzie podczas eksperymentowania z rozszerzaniem / rozszerzaniem powłoki :-)Jedną rzeczą, o której należy pamiętać, jeśli chodzi o symbole wieloznaczne, jest to, że są one rozszerzane przez powłokę. Aplikacja nie wie, czy użyłeś symboli wieloznacznych, czy wpisałeś nazwy. Na przykład, jeśli wpiszesz
rename *.txt *.bak
,rename
polecenie zobaczy coś w rodzajurename file1.txt file2.txt existingfile.bak
. To za mało informacji, aby kontynuować.ls
Najpierw zajmę się pytaniem , ponieważ jest prostsze. Jeśli wszystko, czego potrzebujesz, to pasujące nazwy, to nie potrzebujeszls
, ponieważ powłoka już dokonuje rozszerzenia.Jeśli chcesz uzyskać więcej informacji o plikach, przekaż
-d
opcję dols
, aby powiedzieć jej, aby nie wyświetlała zawartości katalogów.Nie ma standardowego narzędzia do zmiany nazw plików, ponieważ pierwsze systemy uniksowe nie były dostarczane z jednym. Przenośna metoda zmiany nazw plików wykorzystuje pętlę i jest trochę szczegółowa:
Istnieje kilka popularnych narzędzi do zmiany nazw plików, z których żadne nie ma gwarancji zainstalowania w danym systemie uniksowym, ale wszystkie są łatwe do zainstalowania. Oto główne:
rename
zutil-linux
pakietu, dostępny w każdym niewbudowanym systemie Linux (i nigdzie indziej). W Debianie i pochodnych (w tym Ubuntu) to polecenie jest wywoływanerename.ul
. Pod warunkiem, że nie wystąpi.txt
inne niż końcowe rozszerzenie, możesz pisaćrename
jest skryptem Perla, który dostarcza Debian i pochodne/usr/bin/rename
. Możesz zmieniać nazwy plików według dowolnych poleceń Perla.mmv
, który może zmieniać nazwy, kopiować i łączyć pliki zgodnie z kilkoma wzorcami opartymi na nazwach i ma wiele opcji związanych z tym, co się stanie, jeśli nazwa docelowa już istnieje. Pamiętaj, że musisz używać cudzysłowów, aby chronić symbole wieloznaczne przed rozwinięciem przez powłokę.zmv
jest funkcją zsh , dostępną tylko wtedy, gdy twoją powłoką jest zsh. Może dopasowywać dowolne wzorce zsh (dzięki czemu można dopasowywać nazwy plików według dowolnych wyrażeń regularnych, nie tylko symboli wieloznacznych, i można dopasowywać pliki według innych kryteriów, takich jak daty i rozmiary).zmv
można również skopiować i połączyć.Jeśli masz kontrolę nad używanymi maszynami, zalecam użycie zsh jako powłoki (ma to inne zalety niż bash) i umieszczenie tych linii w
~/.zshrc
:noglob
jest funkcją zsh, która mówi powłoce, aby nie rozwijała symboli wieloznacznych w argumencie polecenia. W ten sposób możesz pisaćzmv *.txt \$1.txt
(zawsze musisz zabezpieczyć$
tekst zastępczy).źródło