Ostatnio natknąłem się na plik, którego nazwa zaczyna się od znaku „.”. Chciałem skopiować ten plik, załadować go ffmpeg
i odwołać się do niego na różne inne sposoby w terminalu. Zwykle automatycznie uzupełniam dziwne nazwy plików, ale to się nie udaje, ponieważ nie mogę nawet wpisać pierwszej litery.
Nie chcę przełączać się na mysz, aby wykonać manewr kopiuj-wklej. Nie chcę zapamiętywać wielu kodów dla możliwych scenariuszy. Moje rozwiązanie ad hoc polegało na zmianie vim
, wklejeniu !ls
i skopiowaniu danego znaku, a następnie wyjściu i wklejeniu go do terminala. To działało, ale jest dość przerażające.
Czy istnieje łatwiejszy sposób radzenia sobie z takimi scenariuszami?
UWAGA: Używam skorupy ryb, jeśli to zmienia rzeczy.
command-line
filenames
wildcards
special-characters
fish
ZirconCode
źródło
źródło
*restoffile.avi
lub coś w tym stylu?touch '♫ 漢字カ'
touch '♫ 漢字タ'
Odpowiedzi:
Jeśli pierwszy znak nazwy pliku jest drukowalny, ale nie ma znaków alfanumerycznych ani białych znaków, możesz użyć
[[:punct:]]
operatora glob:źródło
Najprostsze, jakie
ls [^a-zA-Z0-9]*
przychodzi mi do głowy, jest dla mnie skuteczne, ale odpowiedź Terdona lepiej jest zwrócić uwagę na opcję powłoki extglob lub nawet podejście niezależne od powłoki.źródło
ls [^[:alnum:]]*
to samo. Ale lepiej jest użyć klasy postaci, jaką jest , niż klasy, której nie ma ; stądls [[:punct:]]*
wyświetli ten plik.ls ma kilka przełączników (takich jak - quote-name, --escape, --literal) do obsługi znaków niedrukowalnych, ale w tym przypadku wydaje się, że znak jest „drukowalny”, ale nie „wpisywalny” (przynajmniej na mojej klawiaturze! ), więc żaden z tych przełączników nie wydaje się pomóc.
Dlatego jako ogólne podejście „brutalnej siły”, aby pozbyć się plików z dowolnymi postaciami w ich nazwach, możesz to zrobić:
Znajdź wiersz zawierający niepoprawny plik. Całkiem prawdopodobne, że będzie to pierwsza linia, ale powiedzmy, że to piąta. Wydrukuj wiersz 5 i zakoduj go szesnastkowo:
Ignorując znak 0a (nowy wiersz), skonstruuj łańcuch zmiany znaczenia i użyj opcji -e echa, aby przetłumaczyć znaki zmiany znaczenia:
Teraz możesz skopiować / przenieść / usunąć w następujący sposób:
Ponadto, jeśli nie jesteś ograniczony do używania skryptu powłoki, możesz to zrobić w Pythonie w następujący sposób:
Korzystając z tego podejścia, możesz przetwarzać wiele plików, wystarczy napisać logikę wyboru właściwych plików i zmiany ich nazwy bez blokowania itp.
źródło
Podobnym podejściem byłoby wylistowanie wszystkich plików, które nie zaczynają się od „normalnych” znaków. W bash możesz to zrobić za pomocą
Nie wydaje się to jednak dostępne
fish
, więc możesz użyćfind
zamiast tego :źródło
Zmień nazwy dowiązań symbolicznych
Jednym z podejść do obsługi nazw plików ze znakami specjalnymi - jako pierwszych znaków lub w innym miejscu w nazwie pliku jest zmiana nazwy na prostszą .
Można tego użyć, nawet jeśli zachowane są oryginalne nazwy plików : Zmień nazwę kopii nazw plików.
Można to zrobić, kopiując pliki, ale także tworząc dowiązania symboliczne lub dowiązania twarde do plików i zmieniając ich nazwy.
cp
tworzy dowiązania symboliczne zamiast kopii z opcją-s
(-l
dla twardych).Użyj „detox”, aby wyczyścić nazwy
Do zmiany nazwy w celu wyczyszczenia nazw plików
detox
można użyć; Zmienia nazwy plików, aby wyczyścić nazwy plików zgodnie z różnymi regułami zdefiniowanymi wdetoxrc
pliku. Domyślnie znaki UTF8 są właśnie usuwane; Z opcją-s utf_8-only
są one zastępowane przez_
:„detox” na dowiązaniach symbolicznych
W połączeniu z pracą nad dowiązaniami symbolicznymi, jak opisano powyżej:
źródło
Nie używam
fish
, ale dokumentacja mówi, że można wprowadzić znak Unicode, poprzedzając jego kod szesnastkowy znakiem\u
(dla znaków 16-bitowych) lub\U
(dla znaków 32-bitowych). Myślę, że kod dla♫
jest491eb
, więc możesz zrobić:zmienić nazwę
♫abc.mp3
.Zauważ, że potrzebujesz zer wiodących, w przeciwnym razie
abc
na końcu będą traktowane jako cyfry szesnastkowe i część kodu znaku; dla znaku 32-bitowego musisz wprowadzić 8 cyfr.źródło
Nie wiem, czy było tak już w 2014 r., Kiedy zadałeś pytanie, ale w bieżących wersjach
fish
(od 2019 r.) Możesz nacisnąć Tabdwa razy, aby uzyskać wybór w stylu zsh, w którym możesz użyć klawiszy strzałek, aby wizualnie wybierz żądany plik bez konieczności wpisywania jakiejkolwiek części nazwy pliku.źródło
Ryby nie obsługują symboli wieloznacznych ¹ z założenia.
Komenda nie szukać w ukrytych katalogów i wyświetla nazwy plików, które nie zaczynają się od znaków
letters
,digits
,.
_
-
(cf dokumentacjifind
).Uwaga:
$argv
jest specjalną zmienną tablicową (skorupa ryby), która zawiera argumenty funkcji, dlatego podstawowe polecenie może otrzymać dowolne wyrażenie (np. Alias ).¹ W rzeczywistości Fish obsługuje rozwijanie nawiasów (rozszerzenie zmiennej tablicowej), ale Bash używa innej terminologii (rozszerzenia parametrów i nazw plików).
źródło
Użyj
zsh
i wpisz, co będzie dalej. ZSH obsługuje automatyczne uzupełnianie rozmyte i może sobie z tym poradzić. (Jest to szczególnie miłe z wtyczką OH-MY-ZSH .)źródło
Nie powiedziałeś, czy chcesz zachować te problematyczne nazwy plików. Jednym z rozwiązań może być „rozwiązanie” problemu raz na zawsze poprzez zmianę nazwy (części lub wszystkich) plików na nazwy, które można wpisać, uruchamiając ten skrypt:
Spowoduje to wyświetlenie istniejących nazw plików, a po nich każdego
...?
. Wystarczy wpisać, Enteraby pozostawić plik bez zmian; lub wpisz nową nazwę, aby zmienić nazwę. Ta-i
opcja spowoduje wyświetlenie monitu o potwierdzenie zastąpienia, jeśli podasz nazwę innego istniejącego pliku.Ten skrypt można zmodyfikować na kilka sposobów:
*
) na coś bardziej restrykcyjnego, np.*.avi *.mov
Abyś nie musiał patrzeć na każdy plik.mv
nacp
, tak aby zachować kopię pliku z obecną nazwą i utworzyć (tymczasowe?) Kopiowanie z typeable nazwy.Możesz utworzyć nową nazwę pliku na podstawie istniejącej nazwy pliku. Na przykład,
co pozwala spoliczkować prefiks przed starą nazwą. Jeśli wybierzesz unikalny prefiks, pozwoli to na użycie autouzupełniania.
źródło