web-dev-qa-db-fra.com

Obtenir le chemin du fichier relativement

J'ai deux répertoires A et B. Chacun contient un Zip.

Comment puis-je écrire le chemin de ces deux fichiers Zip dans un fichier texte?

Exemple pour le système de répertoires:

FILES/ONE/one.Zip
FILES/TWO/two.Zip

Et je veux lancer la commande depuis le répertoire FILES

4
Krsztr

Vous pouvez utiliser la commande find, avec sa sortie dirigée vers un fichier, de la manière suivante:

/tmp/FILES$ find . -name "*.Zip" -print > outfile.txt

Recherchez tous les fichiers terminés par Zip dans le dossier actuel (FILES) et imprimez-le chemin
La sortie de la commande find est dirigée vers un fichier texte:

Le contenu du outfile.txt est:

/tmp/FILES$ cat outfile.txt 

./TWO/two.Zip
./ONE/one.Zip

Notez que si vous exécutez la commande find dans un dossier situé au-dessus du dossier FILES, votre sortie inclura également la partie FILES du dossier.

par exemple. lorsque la sortie est dirigée vers stdout

/tmp$ find FILES -name "*.Zip" -print
FILES/TWO/two.Zip
FILES/ONE/one.Zip
8
Yaron

Cela peut arriver grâce à un simple effleurement de shell. Par exemple, étant donné

$ tree .
.
├── ONE
│   └── one.Zip
└── TWO
    └── two.Zip

2 directories, 2 files

ensuite

$ printf '%s\n' */*.Zip
ONE/one.Zip
TWO/two.Zip

Redirige la sortie dans un fichier en ajoutant > outfile à la commande. Si vous souhaitez ajouter ./ au début pour rendre le chemin relatif plus explicite, remplacez %s par ./%s

$ printf './%s\n' */*.Zip > outfile
$ cat outfile
./ONE/one.Zip
./TWO/two.Zip

Si vous voulez faire ceci récursivement, alors bash le supporte si vous avez activé l'option globstar Shell, par exemple.

$ cd ..
$ shopt -s globstar
$ printf '%s\n' **/*.Zip
FILES/ONE/one.Zip
FILES/TWO/two.Zip

Si vous utilisez cela dans un script, vous devriez probablement également activer l'option nullglob pour gérer correctement le cas dans lequel aucun fichier correspondant n'existe.

2
steeldriver

Ou vous pouvez le faire avec regex

find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.Zip" > outfile.txt

La sortie est la même:

./TWO/two.Zip
./ONE/one.Zip

Le problème est que cela correspond à tous les fichiers Zip de tous les sous-dossiers. Si vous pouvez définir des sous-dossiers contenant des fichiers, vous pouvez faire:

find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.Zip" > outfile.txt
0
Petr