mkdir -p
utworzy katalog; w razie potrzeby utworzy katalogi nadrzędne.
Czy istnieje podobne polecenie dla plików, które utworzy plik i katalogi nadrzędne w razie potrzeby?
mkdir -p
utworzy katalog; w razie potrzeby utworzy katalogi nadrzędne.
Czy istnieje podobne polecenie dla plików, które utworzy plik i katalogi nadrzędne w razie potrzeby?
Odpowiedzi:
Instalator zrobi to, jeśli otrzyma plik źródłowy /dev/null
. -D
Teza mówi, aby utworzyć wszystkie katalogi nadrzędne:
anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c
Nie jestem pewien, czy to błąd, czy nie - jego zachowanie z plikami urządzeń nie jest wspomniane na stronie podręcznika. Możesz też po prostu nadać mu pusty plik (nowo utworzony mktemp
, na przykład) jako źródło.
Często napotykałem tego rodzaju sytuacje, więc po prostu napisałem funkcję w swoim .bashrc
pliku. To wygląda tak
function create() {
arg=$1
num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
mkdir -p $make_dirs && touch $arg
}
Więc kiedy chcę utworzyć plik w ścieżce nieistniejących katalogów, powiem
create what/is/it # will create dirs 'what' and 'is', with file 'it' inside 'is'
touchp
, jakmkdir -p
Chciałem zasugerować, ponieważ utrzymuje ją w jednym wierszu, chociaż ustawienie zmiennej osobno pozwala ją zmienić i dość łatwo ponownie uruchomić polecenie z historii.
B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"
Można to „sfałszować”.
Rob Griffiths opublikował w 2007 r. Artykuł zatytułowany „ Łatwe tworzenie wielu nowych folderów” na Macworld.com, w którym omówił użycie xargs
polecenia do odczytu listy plików do tworzenia katalogów mkdir
.
xargs
jest w stanie odwoływać się do placeholder
( {}
) z -I
flagą, która zawiera wartość każdego przekazanego argumentu xargs
. Oto różnica między tą flagą a bez:
$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt
xargs
jest również zdolny do uruchamiania dowolnych poleceń powłoki z sh -c
flagą:
foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'
Możemy łączyć te pojęcia ze mkdir -p
zamiast mkdir
i koncepcji w @ldx „s odpowiedzi do produkcji to:
$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
To polecenie w zasadzie mapuje każdą nazwę pliku na rozdzielonej liniami listy plików, odcina część pliku, tworzy katalogi, mkdir -p
a następnie touch
es nazwa pliku w odpowiednim katalogu.
Powiedzmy na przykład, że files.txt
wygląda tak:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
cat files.txt
produkuje deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
jest przesyłane do xargs
-I {}
, xargs
przetłumaczy każdy argument na własne polecenie, więc teraz mamy:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
&&
kombinator do grupowania 3 poleceń, które działają sekwencyjnie - pierwsze polecenie przechowuje plik w zmiennej środowiskowej (która jest ponownie używana przy następnym przejściu pliku) przy użyciu symbolu zastępczego, który wcześniej zarejestrowaliśmy, więc teraz mieć:
f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
mkdir -p
, ale musimy wyciąć nazwę pliku. Prosty w użyciu '${f%/*}'
:
mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
f
zmiennej w całości, gdy touch
:
touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt
cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
, co ma UUOC, a następnie podpowłokujesz na xargs, który podpowłoka wraca do powłoki, gdy while read
pętla ma więcej sensu
while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt
. Mówi również fakt, że nie można przeprowadzić 10-sekundowego wyszukiwania UUOC w Internecie