J'ai ce grand répertoire de plus de 1000 fichiers d'un jeu de données d'apprentissage automatique, mais ces fichiers ont des qualités différentes (des images de roses ou de pâles pour rester simple). J'ai ce fichier CSV avec les noms de fichier de chacun de ces éléments dans le jeu de données, ainsi que leur catégorisation (roses vs marguerites). Comment lire ce fichier CSV et dire à mon gestionnaire de fichiers de déplacer toutes les photos de rose dans un répertoire et toutes les photos de marguerite dans un autre répertoire? Aurais-je besoin d'un script Bash ou s'agit-il déjà de quelque chose qui est déjà intégré à Nautilus?
Bon, un ami et moi avons réussi à écrire un script dans Python qui a très bien résolu le problème.
# Import csv
import csv
# Import os
import os
# Main Function
def main():
# Open dataset file
dataset = open('dataset.csv', newline='')
# Initialize csvreader for dataset
reader = csv.reader(dataset)
# Read data from reader
data = list(reader)
# Variables for progress counter
lines = len(data)
i = 0
# Analyze data in dataset
for row in data:
# Assign image name and state to variables
image = row[0] + '.jpeg'
state = row[1]
# Print image information
print('({}/{}) Processing image ({}): {}'.format(i + 1, lines, state, image))
# Increment i
i += 1
# Determine action to perform
if state is '0':
# Attempt to move the file
try:
# Move the file to nosymptoms/
os.rename(image, 'nosymptoms/' + image)
# Inform the user of action being taken
print(' -> Moved to nosymptoms/')
except FileNotFoundError:
# Inform the user of the failure
print(' -> Failed to find file')
Elif state in ['1', '2', '3', '4']:
# Attempt to move the file
try:
# Move the file to nosymptoms/
os.rename(image, 'symptoms/' + image)
# Inform the user of action being taken
print(' -> Moved to symptoms/')
except FileNotFoundError:
# Inform the user of the failure
print(' -> Failed to find file')
# Execute main function if name is equal to main
if __== '__main__':
main()
Cela fonctionnait mieux parce que j'avais plus de catégories à gérer ... espérons que cela fonctionnera pour tous ceux qui ont le même problème.
Voici un script bash qui devrait faire ce que vous voulez:
#!/bin/bash
fileNameIndex=0 # set to index of file name
categoryIndex=1 # set to index of category
IFS=",""$IFS" # add comma to break lines at commas
while read -a tokens; # read a line and break it into tokens separated by commas
do
file=${tokens[$fileNmeIndex]} # get the file name
category=${tokens[$categoryIndex]} # get the category
if [ ! -d $category ]; then # check if the category directory exists
mkdir $category; # make the category directory
fi
mv $file $category # move the file into the category directory
done
Enregistrez ce script dans un fichier, peut-être do_moves.sh, modifiez-le pour définir les valeurs correctes pour fileNameIndex et categoryIndex, puis exécutez-le en tant que:
./do_moves.sh <data.csv
où data.csv est votre fichier CSV. Assurez-vous de ne pas avoir de fichier portant le même nom qu'une catégorie avant de l'exécuter.