Pas que je sache ... mais vous pouvez simplement faire mkdir -p / path / to / make && touch / path / to / file ... Ce qui ferait un fichier vide dans cette nouvelle structure de répertoires que vous avez créée selon vos besoins.
1
@Kansha combine cela avec dirnameet basenameet nous n'aurons besoin que d'un seul argument; profit! :)
Oui, bon appel.
Réponses:
29
L'installation le fera, si le fichier source lui est fourni /dev/null. L' -Dargument dit de créer tous les répertoires parents:
anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c
-rwxr-xr-x 1 anthony anthony 0Jan3010:31/tmp/a/b/c
Je ne sais pas si c'est un bogue ou non - son comportement avec les fichiers de périphérique n'est pas mentionné dans la page de manuel. Vous pouvez également lui donner un fichier vierge (nouvellement créé avec mktemp, par exemple) comme source.
Le testn'est pas nécessaire; mkdir -pne fait rien si le répertoire existe déjà. Ne renvoie même pas d'erreur.
derobert
1
Et bien sûr, cela ne fait que créer le répertoire.
un CVn du
0
J'allais suggérer car il la maintient sur une seule ligne, bien que définir la variable séparément vous permette de la changer et de réexécuter la commande à partir de l'historique assez facilement.
Rob Griffiths a publié un article en 2007 intitulé Facilement créer beaucoup de nouveaux dossiers sur Macworld.com dans lequel il a expliqué comment utiliser la xargscommande pour lire une liste de fichiers pour créer des répertoires mkdir.
xargsest capable de référencer a placeholder( {}) avec l' -Iindicateur, qui contient la valeur de chaque argument passé à xargs. Voici la différence entre avec ce drapeau et sans:
Cette commande mappe essentiellement chaque nom de fichier dans une liste de fichiers séparés par des lignes, coupe la partie de fichier, crée les répertoires avec mkdir -ppuis touches le nom de fichier dans son répertoire respectif.
Voici une ventilation de ce qui se passe dans la commande ci-dessus:
Dites par exemple mon files.txtapparence comme ceci:
cat files.txt produit deeply/nested/foo/bar.jsdeeply/nested/baz/fiz.txt
deeply/nested/foo/bar.jsdeeply/nested/baz/fiz.txt est canalisé vers xargs
parce que nous avons utilisé -I {}, xargstraduira chaque argument dans sa propre commande, nous avons donc maintenant:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
nous exécutons ensuite une commande shell qui utilise le &&combinateur pour regrouper 3 commandes qui s'exécutent de manière séquentielle - la première commande stocke le fichier dans une variable d'environnement (qui est réutilisée lors de la prochaine passe de fichier) en utilisant l'espace réservé que nous avons enregistré auparavant, nous allons donc maintenant avoir:
f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
nous avons maintenant une variable à laquelle nous pouvons passer mkdir -p, mais nous devons couper le nom du fichier. Assez simple en utilisant '${f%/*}':
mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
puis nous re-référençons simplement la fvariable dans son intégralité lorsque nous touch:
Vous avez toute cette explication pour ce qui est essentiellement cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"', qui a UUOC, puis vous sous-shell en xargs qui sous-shell dans le shell, quand une while readboucle a plus de sens
Steven Penny
1
J'admets que je ne suis pas le plus informé des commandes * nix - je ne sais même pas ce qu'est UUOC - mais je ne vois pas comment c'est une réponse horrible. Il est recherché, testé et est une solution de travail à votre question d'origine. C'est constructif (contrairement à votre commentaire plutôt grossier). S'il vous plaît, si vous sentez que j'ai fait quelque chose d'irresponsable ici que je n'aurais pas dû, alors expliquez davantage - expliquez pourquoi . Peu m'importe le débat d'opinion qui n'a pas de substance.
razorbeard
1
Mon dernier commentaire l'explique parfaitement. Votre réponse entière pourrait être mieux écrite comme while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt. Le fait que vous ne pouvez pas faire une recherche Internet de 10 secondes pour UUOC est également révélateur
dirname
etbasename
et nous n'aurons besoin que d'un seul argument; profit! :)Réponses:
L'installation le fera, si le fichier source lui est fourni
/dev/null
. L'-D
argument dit de créer tous les répertoires parents:Je ne sais pas si c'est un bogue ou non - son comportement avec les fichiers de périphérique n'est pas mentionné dans la page de manuel. Vous pouvez également lui donner un fichier vierge (nouvellement créé avec
mktemp
, par exemple) comme source.la source
Non, pas autant que je sache. Mais vous pouvez toujours utiliser
mkdir -p
ettouch
après l'autre:la source
J'ai souvent rencontré ce genre de situation, j'ai donc simplement écrit une fonction dans mon
.bashrc
fichier. Ça ressemble à çaDonc, quand je veux créer un fichier dans un chemin de répertoires inexistants, je dirai
la source
touchp
, commemkdir -p
la source
test
n'est pas nécessaire;mkdir -p
ne fait rien si le répertoire existe déjà. Ne renvoie même pas d'erreur.J'allais suggérer car il la maintient sur une seule ligne, bien que définir la variable séparément vous permette de la changer et de réexécuter la commande à partir de l'historique assez facilement.
la source
Il est possible de "truquer".
Tout d'abord, une théorie requise:
Rob Griffiths a publié un article en 2007 intitulé Facilement créer beaucoup de nouveaux dossiers sur Macworld.com dans lequel il a expliqué comment utiliser la
xargs
commande pour lire une liste de fichiers pour créer des répertoiresmkdir
.xargs
est capable de référencer aplaceholder
({}
) avec l'-I
indicateur, qui contient la valeur de chaque argument passé àxargs
. Voici la différence entre avec ce drapeau et sans:xargs
est également capable d'exécuter des commandes shell arbitraires avec lesh -c
drapeau:Combiner les concepts:
Nous pouvons combiner ces concepts avec
mkdir -p
au lieu demkdir
et le concept dans la réponse de @ldx pour produire ceci:Cette commande mappe essentiellement chaque nom de fichier dans une liste de fichiers séparés par des lignes, coupe la partie de fichier, crée les répertoires avec
mkdir -p
puistouch
es le nom de fichier dans son répertoire respectif.Voici une ventilation de ce qui se passe dans la commande ci-dessus:
Dites par exemple mon
files.txt
apparence comme ceci:cat files.txt
produitdeeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
est canalisé versxargs
-I {}
,xargs
traduira chaque argument dans sa propre commande, nous avons donc maintenant:deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
&&
combinateur pour regrouper 3 commandes qui s'exécutent de manière séquentielle - la première commande stocke le fichier dans une variable d'environnement (qui est réutilisée lors de la prochaine passe de fichier) en utilisant l'espace réservé que nous avons enregistré auparavant, nous allons donc maintenant avoir:f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
mkdir -p
, mais nous devons couper le nom du fichier. Assez simple en utilisant'${f%/*}'
:mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
f
variable dans son intégralité lorsque noustouch
:touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt
la source
cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
, qui a UUOC, puis vous sous-shell en xargs qui sous-shell dans le shell, quand unewhile read
boucle a plus de senswhile read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt
. Le fait que vous ne pouvez pas faire une recherche Internet de 10 secondes pour UUOC est également révélateur