Trouver le fichier puis cd dans ce répertoire sous Linux
Dans un script shell, comment pourrais-je trouver un fichier par un nom particulier et naviguez vers le répertoire d'effectuer d'autres opérations sur elle?
À partir d'ici, je vais copier le fichier sur un autre répertoire (mais je peux le faire déjà juste de l'ajouter dans le contexte.)
source d'informationauteur Candyfloss
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser quelque chose comme:
Ce sera de localiser la première
ls
régulière fichier de ce répertoire.En termes de ce que chaque bit n':
/
et de la recherche vers le bas, la liste de tous les fichiers standard (-type f
) appeléls
(-name ls
). Il y a d'autres choses que vous pouvez ajouter àfind
pour restreindre davantage les fichiers que vous obtenez.head -1
filtre tous, mais le premier.$()
est une façon de prendre la sortie d'une commande et le mettre sur la ligne de commande pour un autre commande.dirname
peut prendre une spécification complète du fichier et vous donner le chemin d'accès bits.cd
juste des modifications à ce répertoire.Si vous exécutez chaque bit de la séquence, vous pouvez voir ce qui se passe:
La suite devrait être plus sûre:
Avantages:
find
ne pas produire de tels noms de fichier, mais ce n'est pas dangereux et peut être requis pour d'autres constructions similaires)-name
vérifier avant de-type
vérifier car ce dernier nécessite parfois unestat
dirname
nécessaire parce que la%h
spécificateur déjà imprime le nom du répertoire-quit
pour arrêter la recherche, après le premier fichier trouvé, donc pas dehead
nécessaire, ce qui causerait le script échoue sur les noms de répertoire contenant des sauts de ligneBasé sur cette réponse à une question similaire, d'autres choix pourraient avoir les 2 commandes, de la 1re à trouver le fichier et le 2ème pour accéder à son répertoire:
Où
!!
est l'histoire de l'expansion, qui signifie 'la commande précédente'.pas l'un suggérant recherchez (ce qui est beaucoup plus rapide pour les grands arbres) ?
zsh:
bash:
si vous êtes juste de trouver le fichier, puis de le déplacer ailleurs, il suffit d'utiliser trouver et -exec
Expansion sur les réponses déjà données, si vous souhaitez naviguer de manière itérative pour chaque fichier que
find
localisation et effectuer des opérations dans chaque répertoire:Si c'est un programme dans votre
PATH
vous pouvez le faire:ou en Bash:
qui utilise moins un exécutable externe.
Ce n'utilise aucun alias:
Simplement de cette façon, n'est-ce pas élégant?
Bien sûr, vous devez le configurer en premier, mais vous devez faire ce qu'une seule fois:
Ajoutez la ligne suivante dans votre .bashrc ou .zshrc, tout ce que vous utilisez comme votre shell script d'initialisation.
Et ajouter ce code dans ~/bin/cdf.sh le fichier que vous devez créer à partir de zéro.
Si votre fichier est seulement dans un seul endroit, vous pouvez essayer les suivantes:
cd "$(find ~/-name [filename] -exec dirname {} \;)" && ...
Vous pouvez utiliser
-exec
d'invoquerdirname
avec le chemin d'accès qui permettent de trouver des retours (qui va où l'{}
espace réservé à l'est). Que va changer les répertoires. Vous pouvez également ajouter des doubles & (&&
) pour exécuter la commande suivante après la coquille a changé de répertoire.Par exemple:
cd "$(find ~/-name need_to_find_this.rb -exec dirname {} \;)" && ruby need_to_find_this.rb
Il va chercher pour que ruby fichier, accédez au répertoire, puis l'exécuter à partir de l'intérieur de ce dossier. Cet exemple suppose que l' nom de fichier est unique et que pour une raison quelconque, le script ruby doit courir à partir de l'intérieur de son répertoire. Si le nom de fichier n'est pas unique, vous obtiendrez de nombreux endroits passé de cd, il renvoie une erreur alors cela ne va pas changer les répertoires.