Le script python ci-dessous fait le travail. Les fichiers cachés sont stockés séparément dans un dossier, ainsi que les fichiers sans extension.
Puisqu'il pourrait être utilisé à des fins plus diverses, j'ai ajouté quelques options:
- Vous pouvez définir les extensions que vous souhaitez exclure de la "réorganisation". Si vous voulez simplement tout déplacer, réglez
exclude = ()
- Vous pouvez choisir quoi faire avec les dossiers vides (
remove_emptyfolders = True
ou False
)
- Dans le cas où vous souhaitez copier les fichiers au lieu de les déplacer , remplacez la ligne:
shutil.move(subject, new_dir+"/"+name)
par:
shutil.copy(subject, new_dir+"/"+name)
Le script:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
shutil.move(subject, new_dir+"/"+name)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
EN CAS de risque d'écrasement indésirable de fichiers en double
Au détriment de quelques lignes supplémentaires, nous pouvons éviter d'écraser d'éventuels doublons. Avec le code ci-dessous, les doublons seront renommés comme:
duplicate_1_filename, duplicate_2_filename
etc.
Le script:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
n = 1; name_orig = name
while os.path.exists(new_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
newfile = new_dir+"/"+name
shutil.move(subject, newfile)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
ÉDITER
Avec OP à l'esprit, nous avons tous oublié d'ajouter une instruction sur la façon d'utiliser. Étant donné que des questions en double peuvent apparaître ( et apparaissent), cela peut néanmoins être utile.
Comment utiliser
- Copiez l'un des scripts dans un fichier vide, enregistrez-le sous
reorganize.py
Dans la section head du script, définissez le répertoire ciblé (avec les fichiers à réorganiser):
reorg_dir = "/path/to/directory_to_reorganize"
(utilisez des guillemets si le répertoire contient des espaces)
extensions possibles que vous souhaitez exclure (probablement aucune, comme ci-dessous):
exclude = ()
et si vous souhaitez supprimer les dossiers vides par la suite:
remove_emptyfolders = True
Exécutez le script avec la commande:
python3 /path/to/reorganize.py
NB si vous souhaitez copier les fichiers au lieu de les déplacer , remplacez:
shutil.move(subject, new_dir+"/"+name)
par:
shutil.copy(subject, new_dir+"/"+name)
Veuillez d'abord essayer sur un petit échantillon.
-iname '*.*'
devraient s'occuper des caisses d'angle qui m'inquiétaient ... bonne idée!*.fig.bak
ou.profile/.bashrc
, mais il ne devrait au moins gérer que les fichiers avec des extensions. Merci.Calcul de la liste des extensions (après le déplacement):
Calcul de la liste des extensions (avant de déménager):
(dans ce dernier exemple, nous calculons le nombre de fichiers pour chaque extension et le trions)
la source
ls -X | grep -Po '(?<=\.)(\w+)$'
été ma première idée d'obtenir la liste triée des extensions. C'est très mauvais? Que suggérez-vous?ls -X
passe. Pour savoir pourquoi je déconseillels
, voir unix.stackexchange.com/q/128985/70524 et unix.stackexchange.com/q/112125/70524 . Pour réaliser ce que vous faites, j'irais sur un chemin plus long:find . -type f -name '*?.?*' -print0 | sed -z 's/.*\.//' | sort -zu
(avec une option| uniq -cz
, si les comptes sont nécessaires). Etfind ... -print0 | gawk -v RS='\0'
(même si ce n'est pas très portable ) pour le premier.Essayez ce script shell.
la source
filepath
parfile
. Je vais corriger cela directement.for file in "$src"/*?.?*; do ..
read
peut avoir un comportement inattendu. Vous devez également citer les variables dans les commandes mkdir et mv.for i in *; do printf "%s\n" "$i"; done; for i in $(ls -d); do printf "%s\n" "$i"; done
Si vous avez renommé / prénommé Perl:
la source