J'ai une liste de dossiers qui ont des dates pour les noms. Les dates sont au format AAAAMMJJ (par exemple 20150129). Dans ces dossiers se trouvent des documents texte liés à cette date spécifique.
Je voudrais les restructurer dans une hiérarchie de dossiers allant d'année en mois et jusqu'à ce jour, et déplacer les documents texte dans le dossier «date» correspondant plus bas dans la hiérarchie.
En d'autres termes, je voudrais que le dossier «racine» soit nommé d'après l'année comme 2015, puis créer des sous-dossiers nommés avec des mois comme 01, puis créer d'autres sous-dossiers nommés avec des dates comme 29 qui contiennent les documents texte correspondants .
Le chemin ressemblerait donc à 2015/01/29/file.txt
ou 2015>01>29>file.txt
.
J'ai jeté un coup d'œil à Automator et il semble que quelque chose comme ça ne soit pas possible bien que je puisse me tromper, donc je voudrais savoir ...
Existe-t-il une solution simple à ce problème que tout profane peut comprendre, par exemple un workflow Automator, ou cela nécessite-t-il une certaine compréhension des commandes de terminal et des expressions régulières?
Comment pourrait-on résoudre ce problème à condition qu'il existe en fait une solution?
Réponses:
En supposant que tous ces dossiers YYYYMMDD font partie du même répertoire parent que vous pourriez exécuter
for d in */; do
boucle lit toutes les entrées du répertoire, la fin/
garantit que seuls les noms de répertoire correspondent réellement[[ $d =~ [0-9]{8}/ ]]
teste si l'entrée actuelle se compose de 8 chiffres et continue avec l'entrée suivante sinon${d:0:4}/${d:4:2}/${d:6:2}
utilise l'expansion des paramètres à l'intérieurbash
pour créer une chaîne contenant le nouveau chemin--
dans les deuxmkdir
etmv
empêche le problème au cas où le répertoire ou le nom de fichier commence par un-
. Cela ne peut pas arriver ici, mais c'est probablement une bonne pratique de toute façon.Merci à @terdon et @ user3439894 pour des idées sur la façon d'améliorer le script original.
la source
Vous pouvez utiliser ce qui suit dans Terminal.
cd
dans le dossier contenant, puis exécutez ce qui suit:find . -type f
obtient chaque fichier du répertoire courant de manière récursive.-exec bash -c
ouvre un shell pour exécuter les commandes suivantes.F=$(…)
ouvre un sous-shell et utilise sed sur le chemin du fichier pour manipuler le chemin dans les dossiers.^\./([0-9]{4})([0-9]{2})([0-9]{2})
est une expression régulière avec trois groupes de capture, comme suit: est un remplacement, où chaque groupe de capture ( , etc.) est séparé par . crée les répertoires dans lesquels déplacer les fichiers. déplace chaque fichier dans son dossier correspondant.\1/\2/\3
\1
/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"
Cela prend la hiérarchie à gauche et la convertit en hiérarchie à droite:
S'il y a d'autres fichiers dans le dossier contenant avec une date comme nom, ils seront déplacés comme s'ils étaient un dossier. Pour éviter cela, remplacez la deuxième ligne par:
Le
(?:/.+)
garantit que le chemin a un composant ultérieur, ignorant ainsi tout ce qui ne contient pas d'enfant dans le répertoire parent qui sont des fichiers.la source