Puncte:2

Cum aș crea o listă de subdosare într-un folder dat fără calea completă?

drapel gb

Următoarele într-un script bash:

găsiți /Volumes/SpeedyG -type d >> fișier.txt

...funcționează bine pentru a lista folderele din acea cale într-un fișier text,

/Volume/SpeedyG/folder1  
/Volume/SpeedyG/folder2  
/Volume/SpeedyG/folder2

dar rezultatele sunt calea completă către folder.

Ce se întâmplă dacă aș vrea doar numele folderului fără calea completă?


folder1  
folderul 2  
folder3  
Puncte:6
drapel hr

Pentru implementarea GNU a găsi, puteți face acest lucru folosind acțiunea de ieșire formatată printf:

          %P Numele fișierului cu numele punctului de pornire sub
                 care a fost găsit scos.

Asa de

găsiți /Volumes/SpeedyG -type d -printf '%P\n' >> file.txt

Dacă doriți să eliminați toate Componentele principale ale directorului, puteți utiliza %f în loc de %P. Daca ai zsh, puteți face același lucru folosind shell globbing recursiv și :t calificativ (coada):

print -rC1 /Volumes/SpeedyG/**/*(ND/:t)

caz in care nu aveti nevoie găsi deloc. Cu orice POSIX SH, ai putea face mereu

găsiți dir -type d -exec sh -c '
  pentru f printf „%s\n” „${f##*/}”; Terminat
' find-sh {} +
drapel gb
Trebuie să am o problemă de sintaxă. Dacă rulez asta de pe terminalul meu mac, primesc `find: -printf: unknown primary or operator`. Poate că este diferit în OSX decât în ​​Ubuntu.
ojdo avatar
drapel co
@JonGriffith: da, acesta pare să fie cazul: https://superuser.com/a/293200/238733, iar aici un răspuns mai actualizat (2020 în loc de 2011): https://stackoverflow.com /a/61158594/2375855
drapel cn
@JonGriffith Dacă căutați răspunsuri pentru OSX și nu pentru Ubuntu, [Unix SE](https://unix.stackexchange.com/) este un loc mult mai bun pentru a întreba. [Superuser SE](https://superuser.com/) ar putea funcționa și el.
Puncte:0
drapel cn

tree -di /Volumes/SpeedyG vă va oferi o listă numai cu subdosare.

arbore -dia /Volume/SpeedyG vă va oferi o listă cu numai subfoldere pentru a include directoare ascunse.

arbore -diL 1 /Volume/SpeedyG vă va oferi o listă cu doar subdosarele de nivel 1 în.

notă: dacă un director este o legătură simbolică către un alt director, atunci acea linie de ieșire va afișa legătura și calea către directorul țintă...
Ați putea să-l eliminați cu o declarație grep de genul tree -di /Volumes/SpeedyG | grep -v "\->"

drapel gb
Aș prefera un rezultat care să taie calea principală, astfel încât să obțin totul doar în dreapta lui SpeedyG/
WU-TANG avatar
drapel cn
@JonGriffith Pentru a fi clar, ceea ce spui este, dacă ai făcut `tree -di /Volumes/SpeedyG > sampletext.txt`... Și te uiți la sampletext.txt, singurul lucru care este nedorit în fișier, este chiar prima linie din ea... corect?
drapel gb
Nu. Fiecare linie din fișierul txt se referă la calea completă a fișierelor care au fost adăugate la txt, adică /Volumes/SpeedyG/folder1. Aș dori ca lista rezultată să fie tăiată pentru a afișa doar o listă a tuturor folderelor găsite la acest nivel, astfel încât lista să fie „folder1, folder2, folder3” etc.
WU-TANG avatar
drapel cn
@JonGriffith ... nu am aceleași rezultate pe care le vedeți voi..tot ce văd este un nume de subdirector pe linie... De fapt, dacă aș vrea să văd calea completă, ar trebui să fac în schimb `tree -fdi /Volumes/SpeedyG`... Dar acum că ai menționat " la acest nivel”, voi edita pentru oricine altcineva care ar considera asta util. Totuși, nu știu ce să spun despre motivul pentru care vezi ceea ce vezi.
Puncte:0
drapel mx

GNU nume de bază elimină toate componentele directorului principal dintr-o cale completă.

$ nume de bază /Volume/SpeedyG/folder1
folder1

Pentru a procesa mai multe căi, utilizați --multiplu opțiune:

â-aâ
â--multipluâ
     Susține mai mult de un argument. Tratați fiecare argument ca pe un NUME.
     Cu aceasta, trebuie specificat un SUFIX opțional folosind â-sâ
     opțiune.

$ nume de bază -a /Volumes/SpeedyG/folder1 /Volumes/SpeedyG/folder2 /Volumes/SpeedyG/folder3
folder1
folderul 2
folder3

Într-un script, o modalitate mai eficientă de a elimina cel mai mare prefix este să recurgeți la extinderea parametrilor astfel:

file="/Volume/SpeedyG/folder1"
file="${file##/*/}"

Puteți utiliza acest lucru într-un pentru buclă:

pentru i în /Volumes/SpeedyG/*
do
    printf „%s\n” „${i##/*/}”
gata > $HOME/files.txt

$ cat ~/files.txt
folder1
folderul 2
folder3

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.