Vraag Verkrijg alle bestandspaden vanaf een bepaald punt en van pipe naar tekstbestand


Als mijn terminal zich momenteel in bevindt home/stuff/stuff2 en er zijn meer mappen en bestanden onder stuff2, hoe kan ik een opdracht starten om de bestandsnamen te krijgen van alle bestanden en mappen uit deze map en verder (inclusief alle submappen).

De bewerking moet het volgende doen:

  1. Het bestandspad moet beginnen op de locatie van de opdracht terminal, dus ik wil geen volledige bestandspaden. Voorbeeld, in plaats van dat de uitlezing is home/stuff/stuff2/stuff3/cat.png Ik zou liever hebben dat het wordt voorgelezen stuff3/cat.png
  2. Het moet alle bestanden en mappen en bestanden binnen die mappen vastleggen.
  3. Het moet worden doorgesluisd (ik denk dat dit de term is) naar een tekstbestand.

Om het even welke ideeën?


0
2017-11-15 01:49


oorsprong


Wilt u de namen van de mappen op zichzelf, of alleen de bestanden in de mappen? dat wil zeggen, wilt u bijvoorbeeld "Muziek", "Muziek / bestand1.mp3", ..., "Afbeeldingen", "pic1.jpg", ... - Marty Fried
@joseph Waarom niet gewoon hardlopen find * (?) als je er bent home/stuff/stuff2 directory? - αғsнιη
Trouwens, als je het hebt over het uitvoeren van een opdracht met uitvoer naar een bestand, is de correctere term dat omleiden. Strikt gesproken, bies verwijst naar het uitvoeren van een opdracht waarvan de uitvoer rechtstreeks naar de invoer van een ander commando gaat. - G-Man


antwoorden:


Het bevel

find -printf "%P\n" > file

toont alle bestanden en mappen onder de huidige map en redirect de lijst met file. Van de printf gedeelte van man find

  %P     File's name with the name of the command  line  argument
         under which it was found removed.

2
2017-11-15 02:01



find -printf "%P\n" > file zal de directorynamen ook zelf afdrukken. Ik stel voor dat je de schakelaar gebruikt die ik heb gespecificeerd, -type f, om alleen bestandsnamen weer te geven. - Marty Fried
@MartyFried the OP vraagt ​​specifiek om "een opdracht om de bestandsnamen van alle bestanden te krijgen en mappen" - steeldriver
Toegegeven. Ik veronderstelde dat hij de inhoud van de mappen bedoelde, maar dat kon onjuist zijn. Hopelijk zal hij zijn vraag becommentariëren of bewerken om hem op te ruimen. - Marty Fried


In aanvulling op find, het is ook mogelijk om dit te doen met alleen de bash shell:

shopt -s globstar
printf "%s\n" ** >file

Alle uitvoerbestandsnamen worden afgedrukt familielid naar de huidige map.

shopt -s globstar stelt globstar wat geeft bash een deel van de kracht van find. Met globstar, twee sterren op een rij zullen, als man bash staten: "match alle bestanden en nul of meer mappen en submappen." Hier, printf wordt gebruikt om de bestandsnamen één op een regel te formatteren. De uitvoer wordt verzonden naar een tekstbestand met de naam file.

Bestandsnamen met speciale tekens

Deze vraag vraagt ​​om uitvoer in een tekstbestand. Tekstbestanden hebben over het algemeen regels gescheiden door nieuwe-regeltekens. Als een bestands- of mapnaam zelf een nieuwlijnteken bevat, leidt dit tot verwarring. Tenzij bekend is dat een dergelijk bestand niet bestaat, is het beter om een ​​door nul gescheiden bestand te gebruiken, niet een door een nieuwe regel gescheiden tekstbestand.

In dit geval kan men gebruiken:

printf "%s\000" ** >file

Of,

find -print0 >file

Aangezien het nul-teken (ascii 000) nooit toegestaan ​​is in een bestandsnaam, is dit het enige formaat dat kan worden gebruikt om bestandsnamen op te slaan in een bestand zonder het risico van verlies van informatie.


2
2017-11-15 02:47



Als u namen wilt opnemen die beginnen met een punt (.), je moet ook shopt -s dotglob. - G-Man


Als u het bestand kunt verwerken in de vorm "./dir/bestandsnaam", dan zou een eenvoudige vorm van de opdracht find werken:
find . -type f > filename zal alle bestanden onder de huidige map naar "bestandsnaam" pipen.

Na het zien van @ steeldriver's antwoord, zou een combinatie van zijn oplossing en die van mij het voorvoegsel "./" elimineren, zoals:

Als je dat doet niet wil lege mapnamen in de lijst (dat wil zeggen, alleen de bestandsnamen in elke map,
find -type f -printf "%P\n" > file

Als je dat echt bent do wil de directorynamen op zichzelf samen met de map / bestandsnamen, en laat dan de vlag "-type f" weg van alle voorbeelden.


1
2017-11-15 02:05



OP wil zowel mapnamen als bestanden. dus verwijder de -type f - αғsнιη
@KasiyA: Dat weten we niet echt. Ik heb ontdekt dat voor een zeer groot percentage vragen van beginners ze niet zo geformuleerd zijn dat je ze letterlijk, woord voor woord kunt nemen. Je interpretatie is anders dan de mijne, maar totdat ik het anders hoor, zal ik niet aannemen dat de een of de andere is wat hij eigenlijk wilde. - Marty Fried
Ja dat klopt. Hij zei "bestandsnamen van alle bestanden en mappen uit deze map ". deze zin van hem is onduidelijk, maar ik denk dat hij alle bestanden en mappen naam wil volgens zijn geaccepteerde antwoord. - αғsнιη