Comment déplacer uniquement des fichiers sous Unix


18

Comment puis-je déplacer uniquement les fichiers simples (pas les répertoires) d'un dossier sous Linux vers un autre dossier à l'aide de la mvcommande?

J'ai essayé mv * ~/, mais il a tout copié, y compris les répertoires.


vos commentaires mentionnent une restriction supplémentaire: la commande ne doit pas déplacer les fichiers cachés du répertoire de travail actuel. si cela est correct, pourriez-vous modifier votre question pour en faire mention? dire "déplacer uniquement les fichiers" nous fait penser à "déplacer tous les fichiers", ce qui inclut les fichiers cachés.
Quack Quichotte

Réponses:


29

Tu peux essayer

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Wow, quelqu'un qui sait utiliser find. Pour être complet, vous devez utiliser -name [^.] * Dans la recherche, c'est-à-dire --- find. -maxdepth 1 -type f -name [^.] * -exec mv {} chemin \;
chris

NE PAS COPIER-COLLER CECI DANS VOTRE COQUILLE. Le point-virgule entraînera son exécution immédiate. :)
Sherwood Callaway

@SherwoodCallaway Le point-virgule marque la fin de-exec
dstonek

4

Je suis un gars "utilisez un marteau pour tout" donc j'utilise des programmes shell bourne pour des trucs d'autres utilisent des programmes externes pour ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

Certaines personnes aiment faire les choses en tapant le moins possible mais je suis une dactylo assez rapide et j'ai des trucs comme ça intégrés dans mon cerveau donc ce n'est pas trop pénible de le faire au lieu de chercher l'exact arguments pour trouver et exécuter et tout ça.

YMMV, cependant ...


merci pour ça je vais l'essayer. mais j'ai toujours besoin de l'autre réponse car c'est pour un projet que je fais en cours linux. merci beaucoup

1
Ceci est une réponse à votre question. mv n'a aucune compréhension des fichiers ou répertoires ou fifos ou autres fichiers spéciaux. mv ne comprend que les entrées de répertoire et les inodes, et en ce qui les concerne, ils sont tous identiques quel que soit le type de fichier. Pour permettre à mv de déplacer uniquement un type de fichier spécifique, vous avez besoin de quelque chose comme test ou find qui peut réellement regarder l'inode pour voir ce qu'est le fichier. En d'autres termes, on vous pose une question piège si on vous demande de le faire uniquement avec mv.
chris

1
Et je dis que mv ne comprend les inodes que parce qu'il est capable de déplacer un fichier d'un système de fichiers à un autre, qui est techniquement un cp puis un rm, pas un mv (qui est vraiment juste un ln puis rm). Recherchez les liens physiques et les entrées de répertoire.
chris

2
shorty: Ceci est une bonne réponse, vous devez utiliser quelque chose en plus de la commande mv (au moins le shell). Il s'agit d'une base car elle se fait sans programmation.
Kyle Brandt

3

@Mereghost est très proche. Voici ce que j'obtiens pour déplacer tous les fichiers (y compris les fichiers cachés), mais pas les répertoires:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

La .recherche après suppose que votre répertoire actuel est la source des fichiers que vous souhaitez déplacer. Sinon, la commande peut être révisée comme suit:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Si vous souhaitez déplacer uniquement les fichiers normaux et non les fichiers masqués:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Si vous souhaitez déplacer uniquement les fichiers cachés et non les fichiers normaux:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

Si vous n'avez aucun dossier avec un nom avec un point, vous pouvez les déplacer simplement:

mv . ~ / dossier de destination

(Mon hypothèse est que tous vos fichiers sont quelque chose.quelque chose (dans mon cas, tous le sont généralement))

MAIS grâce à d'autres réponses - très utiles. THX


-1

vous pouvez utiliser find

find * -maxdepth 1 -type f -exec mv {} ~ \;

ouais bien cela a fonctionné mais pas à 100% il a copié tous les fichiers des répertoires et sous-répertoires vers ~ / location. j'ai juste besoin de quelque chose de très basique qui copie les fichiers sans les fichiers cachés du répertoire dans lequel je suis vers un autre répertoire. c'est ça. merci pour les conseils quand même

C'est impossible avec maxdepth comme 1.
John T

corrigé afin qu'il ne copie pas les fichiers cachés.
John T

1
La syntaxe sur find est find puis un répertoire puis une description des opérations et des choses à faire correspondre. En règle générale, on n'utilise jamais un caractère générique tel que find * sans le protéger contre la globalisation (c'est-à-dire find / path / to / directory -name goo * -type f.
chris

1
La recherche ne fonctionne correctement que si vous lui donnez un seul chemin à examiner. Dans votre exemple, par exemple, s'il y a des fichiers qui commencent par - la recherche explosera de manière inattendue. Il est toujours préférable d'avoir un seul programme pour lire l'entrée de répertoire, et dans votre exemple, vous utilisez un peu deux programmes différents (find et shell).
chris

-2

mv `find ./sourcedir/* -type f` ./destdir


2
Cela échouera pour tous les fichiers contenant des espaces dans leur nom. La sortie des commandes qui affichent les noms de fichiers ne doit jamais être analysée, sauf s'il peut être garanti qu'elle est correctement délimitée. Voir Pourquoi vous ne devriez pas analyser la sortie de ls (1) pour l'idée principale. L'utilisation de findl' -execoption est la meilleure façon d'éviter le problème.
slhck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.