To poważne pytanie. Testuję niektóre awk
skrypty i potrzebuję plików z nową linią w nazwie.
Czy można dodać nowy wiersz do nazwy pliku za pomocą mv
?
Teraz mogę to zrobić za pomocą touch
:
touch "foo
bar"
Dotykając dodałem znak nowej linii na kopię i wklej. Ale nie mogę pisać foo
Returnbar
w mojej powłoce.
Jak mogę zmienić nazwę pliku, aby nazwa pliku zawierała nową linię?
Edytuj 2015/06/28; 19:08
Aby dodać nowy wiersz w zsh
, mogę użyć Alt+Return
mv
byłoby czymś innym niż robienie tegotouch
? Próbowałeś tego samego?mv
polecenia tak łatwo, jaktouch
.Odpowiedzi:
To zły pomysł (mieć dziwne znaki w nazwach plików), ale możesz to zrobić
(mogłeś także zrobić
mv somefile.txt "$(printf "foo\nbar")"
lubmv somefile.txt foo$'\n'bar
etc ... szczegóły są specyficzne dla twojej powłoki. Używamzsh
)Przeczytaj więcej o globowaniu , np. Glob (7) . Szczegóły mogą być specyficzne dla powłoki. Ale zrozum, że
/bin/mv
jest to (przez twoją powłokę), poprzez execve (2) , rozszerzona tablica argumentów: rozwijanie i globowanie argumentów jest obowiązkiem powłoki wywołującej.Możesz nawet napisać mały program C, aby zrobić to samo:
Zapisz powyższy program w
foo.c
, skompiluj go, agcc -Wall foo.c -o foo
następnie uruchom./foo
Podobnie, możesz napisać podobny skrypt w Perlu, Ruby, Python, Ocaml itp.
Ale to zły pomysł. Unikaj nowych linii w nazwach plików (wprowadzi użytkownika w błąd i może uszkodzić wiele skryptów).
W rzeczywistości polecam nawet używać nieakcentowanych liter, cyfr i
+-/._%
znaków (z/
separatorem katalogów) w ścieżkach plików. Z plików „ukrytych” (zaczynających się od.
) należy korzystać ostrożnie i bezstronnie. Uważam, że użycie dowolnego miejsca w nazwie pliku jest błędem. Zamiast tego użyj podkreślenia (np.foo/bar_bee1.txt
) Lub minus (np.foo/bar-bee1.txt
)źródło
foo
.@
i,
byłby bardziej nieszkodliwy niż-
(jak na pierwszej pozycji) lub%
. Wszystkie te zalecenia dotyczą głównie omijania błędów w niektórych aplikacjach (które psują nazwy plików, które w innym przypadku są prawidłowe z punktu widzenia systemu operacyjnego). Czuje się zacofanym, prosząc ludzi, aby nie używali tych postaci, zamiast naprawiać swoje błędy.Jeśli używasz bash, to polecenie powinno działać.
źródło
zsh
również z =)Wiem, że poprosiłeś o
mv
rozwiązanie, jednak pomimo ostrzeżenia można to łatwo zrobić za pomocąrename
(w pakiecie Perla):źródło
rename
bardzo dobry pomysł. +1Jeden aspekt tego problemu tak naprawdę nie dotyczy
awk
- i tylko trochę o powłoce. Problem polega na tym, że na standardowym, kanonicznym tty przez większość czasu dyscyplina tty jądra buforuje twoje dane wejściowe - po prostu odbijają je na ekranie i nigdzie indziej - aby mógł skutecznie obsługiwać odstępy wsteczne i tym podobne.Jednak gdy naciśniesz klawisz Return lub w inny sposób wprowadzisz nowy wiersz, wszystkie buforowane dane zostaną natychmiast przekazane do aplikacji do czytania - zwykle do powłoki. Możesz to zaobserwować, obserwując
$PS2
po wprowadzeniu wiszącego cytatu. Gdy powłoka drukuje$PS2
, dzieje się tak, ponieważ po prostu odczytuje jakiś blok danych wejściowych i nie jest jeszcze przekonana, czy to koniec.Tak więc, dla wygody, potrzebujesz jakiegoś sposobu wysłania
\n
ewline do bufora terminala bez konieczności natychmiastowego wypychania wszystkich innych danych wejściowych. Standardowym sposobem na to jest sekwencja klawiszyCTRL+V
- która podaje terminalowi twój następny znak wejściowy. ZróbCTRL+V
toCTRL+J
- ponieważ to drugie jest zwykle jak\n
napisać dosłowną ewline. Będziesz wiedział, że zadziałało, gdy nie widzisz,$PS2
ponieważ powłoka nadal nie odczytała danych wejściowych.Zauważ jednak, że jeśli nie przeczytałem, że wejście wcześniejszej
CTRL+V
będzie dokonały żadnego znaczenia dla powłoki w ogóle - że tylko cytuje go w składzie dyscypliny. Na pewno będziesz chciał zacytować nowy wiersz, a także zrobić z nim coś sensownego.Nawiasem mówiąc,
CTRL+V
może być użytecznie zastosowany na inne sposoby - na przykład"$(printf \\33)"
nie jest to jedyny sposób na zapisanieESC
znaku w skrypcie powłoki - i nie jest nawet najprostszy. Możesz dosłownie wprowadzić dowolny znak, który wyśle klawiatura, bez próby jego interpretacji przez sterownik wejściowy, jeśli po prostu w ten sposób uciec.Często lubię używać <tab> w wierszu poleceń bez powłoki, która próbuje cokolwiek ukończyć. Ponieważ powłoki, które wykonują uzupełnianie, zwykle konfigurują <tab> w sposób synonimiczny
stty eol \t
, aby ich systemy uzupełniające działały,CTRL+V
działa dla mnie nawet w nieznanym środowisku.źródło