Déplacer des fichiers / dossiers cachés avec la ligne de commande ou le fichier batch

15

Question

Quelqu'un connaît-il un moyen de déplacer des fichiers et des dossiers dont l'attribut masqué, système ou en lecture seule est défini à partir de la ligne de commande ou d'un fichier de commandes? (Non, supprimer les attributs en premier n'est pas une option car il n'y a aucun moyen pratique de savoir quels attributs ont été définis afin de les réinitialiser après le déplacement.)


(Échec) Tentatives

  1. L'utilisation de la movecommande de base ne fonctionne pas avec les éléments avec le jeu d'attributs caché ou système et pour une raison quelconque, elle n'a pas de commutateurs pour spécifier les attributs comme le font les commandes diret del.

  2. J'ai essayé d'utiliser un utilitaire que j'ai écrit qui utilise la fonction d'opération de fichier du shell, mais qui nécessite d'utiliser start /wpour empêcher le fichier de commandes de s'exécuter à l'avance, et il se plaint de la prise en charge des noms de fichiers longs pour une raison quelconque.

  3. J'ai essayé d'utiliser robocopy, mais il copie d' abord les fichiers, puis supprime les originaux au lieu de simplement déplacer la source (ce qui entraîne un retard frustrant, même avec la sortie excessive redirigée vers nul).

(Étonnamment, il semble que peu de personnes aient jamais eu besoin de déplacer des fichiers cachés de la ligne de commande. Tout ce que j'ai pu trouver, c'est cette seule personne qui a abandonné la tentative.)

Synetech
la source
4
Si vous créez le \temprépertoire, pourquoi ne pas simplement renommer / déplacer le %1répertoire \temp? Ou est-ce juste le cas simplifié?
Ken
Il s'agit en effet d'un cas simplifié. Renommer simplement ne fonctionnerait pas.
Synetech
Pourquoi supprimer un attribut n'est pas une option? Ce serait la façon appropriée (et voulue) de le faire.
Tour
> Pourquoi retirer un attribut n'est pas une option? @Idigas, comment sauriez-vous exactement quels attributs ont été définis sur chaque élément afin qu'ils puissent être correctement réinitialisés? > Ce serait la manière appropriée (et voulue) de le faire. Cela ne sonne pas du tout correctement.
Synetech
Pardonnez mon ignorance, mais est-ce que quelque chose comme jamesewelch.com/2008/05/01/… fonctionnerait?
Dr Kitty

Réponses:

6

J'ai pu déplacer avec succès des fichiers masqués en lecture seule à l'aide de MV.EXE à partir des utilitaires GNU pour Win32. Le fichier cible conserve les attributs masqués en lecture seule.

Vous devrez télécharger le package complet:

http://gnuwin32.sourceforge.net/downlinks/coreutils-bin-zip.php

RobW
la source
1
Pas mal. Cela fonctionne, malheureusement il meurt en traitant des fichiers qui commencent par --; il pense que c'est un argument au lieu d'un nom de fichier.
Synetech
2
Pas mal? C'est ça? Il résout votre demande. Je ne vois rien sur l'exigence '--filename', ou je l'aurais testé. Toutes mes excuses, mais les exigences cachées sont un mauvais sport.
RobW
Oui, pas mal. Il ne fait que l'opération de base que j'ai demandée. S'il ne peut pas gérer les noms de fichiers Windows valides, il n'est pas très utile maintenant, n'est-ce pas? La gestion correcte des noms de fichiers n'est pas une exigence «cachée».
Synetech
3
@Synetech, il vous suffit de qualifier le nom du fichier:mv .\--1.txt newdirectory
dangph
4
Les utilitaires Unix sont généralement utilisés --foopour désigner les arguments de ligne de commande. Afin de prendre en charge les noms de fichiers commençant par --, la plupart d'entre eux acceptent un argument spécial --pour indiquer la fin des arguments de ligne de commande et le début des noms de fichiers. Je ne sais pas si mvc'est une de ces commandes, mais si c'est le cas, alors vous devriez pouvoir:mv -- --weirdFileName.gotcha betterFileName.txt
Ben
5

Je viens de réaliser cela en utilisant:

xcopy /H hidden_file destination_file
del /AH hidden_file
Ben
la source
1
La question demande comment déplacer des fichiers. L'OP sait copier et supprimer et ne veut pas le faire. De plus, il dit qu'il sait déjà comment supprimer des fichiers cachés.
Scott
2
Scott a raison; si les volumes source et de destination sont identiques, la dernière chose que vous voulez faire est de «déplacer» un fichier en le copiant d'abord. Au mieux, il est inutile avec un seul petit fichier, mais avec un gros fichier, ou de nombreux petits fichiers (sans parler de nombreux gros fichiers), il est horrible (CPU et charge de disque élevés). Cela est encore pire si vous déplacez toute une arborescence de répertoires. Le système de fichiers prend déjà en charge un déplacement rapide et facile en modifiant les pointeurs d'entrée de répertoire; le problème vient de l'interface du système d'exploitation qui empêche de le faire avec des fichiers cachés.
Synetech
Assez juste, ce n'est pas un vrai mouvement. Et pour les gros mouvements, cela peut entraîner beaucoup de frais généraux. Mais l'OP n'a jamais dit qu'une copie + supprimer était nécessairement une mauvaise chose, et malgré tout, c'est l'un des meilleurs résultats dans les recherches sur le Web pour savoir comment déplacer un fichier caché de la ligne de commande, et cela a fonctionné pour ce que je devais faire . J'imagine que les gens qui cherchent simplement à déplacer quelques fichiers cachés pourraient également l'utiliser au lieu d'installer des outils GNU ou PowerShell. Très ennuyeux que la commande "move" ne puisse tout simplement pas faire cela.
Ben
1
De la question: « (Échec) Tentatives … 3. J'ai essayé d'utiliser robocopy, mais il copie d' abord les fichiers puis supprime les originaux au lieu de simplement déplacer la source (ce qui entraîne un retard frustrant,…).»
Scott
Assez juste ... Je suppose que j'ai lu cela comme "je ne veux pas utiliser robocopy" au lieu de "je ne veux pas une opération de copie + suppression". Mais je vois votre point.
Ben
3

Powershell v2:

move-item -force   '--1.txt' newdirectory

déplace également les fichiers cachés avec des attributs cachés et système définis. Fonctionne avec les fichiers commençant par «-».

RobW
la source
1
Je suis sûr que cela fonctionnerait, mais PowerShell est atrocement lent par rapport à l'invite de commande normale. Et non, ce n'est pas une exigence «cachée», j'ai clairement indiqué mon aversion pour le retard de Robocopy dans la question. (S'il vous plaît, ne me dites pas que cela fonctionne rapidement sur votre système, car cela ne m'aide en rien. Sur mon système, le chargement prend plusieurs secondes simplement, et même en appuyant simplement sur Tabpour terminer un nom de fichier, il faut plus de 1 seconde, ce qui est une commande). d'amplitude plus lente qu'en cmd
dedans
Solution PowerShell encore plus simple:mv .oldfile .newfile
Jay Sullivan
0

Que dis-tu de ça?

C:\Temp>attrib hidden.txt
A   H        C:\temp\hidden.txt

C:\Temp>mklink /H renamed.txt hidden.txt
Hardlink created for renamed.txt <<===>> hidden.txt

C:\Temp>del /AH hidden.txt

C:\Temp>attrib renamed.txt
A   H        C:\temp\renamed.txt
Ben
la source
De toute évidence, cela ne fonctionne que dans les limites de l'endroit où les liens physiques sont autorisés. Je pense que cela signifie que la destination du fichier doit être sur la même partition du même disque physique. Mais si cette contrainte n'est pas respectée, je suis quasiment sûr qu'une copie + suppression serait de toute façon nécessaire, sous le capot.
Ben
Idée intéressante. Bien sûr, il est trop limité (j'utilise uniquement NTFS pour le lecteur système Windows 7 et FAT32 pour tout le reste. En outre, j'utilise généralement Windows XP.) Il semble également fonctionner de manière incohérente avec différentes combinaisons d'attributs. Par exemple, si vous définissez l'attribut en lecture seule, il ne vous permettra pas de supprimer le «nouveau» fichier la première fois que vous essayez de le supprimer, mais il supprime l'attribut. ಠ_ ఠ Et bien sûr, cela ne fonctionne pas pour les dossiers.
Synetech
0

Nous avons eu PowerShell et la mvcommande. Pour être complet, donc, voici comment le faire avec TCC / LE JP Software , dont moveet les rencommandes ont tous deux une /a:option qui est commune à bon nombre de ses commandes que les répertoires analyse des fichiers de fonctionner sur:

[C: \ Users \ JdeBP] touch / c --wibble--
11/03/2014 20: 29: 18.868 C: \ Users \ JdeBP \ - wibble--

[C: \ Users \ JdeBP] attrib + h + s. \ - wibble--
___A___________ -> _HSA___________ C: \ Users \ JdeBP \ - wibble--

[C: \ Users \ JdeBP] move / a: hs --wibble-- --wobble--
C: \ Users \ JdeBP \ - wibble-- -> C: \ Users \ JdeBP \ - wobble--
     1 fichier déplacé

[C: \ Users \ JdeBP] ren / a: hs --wobble-- --wurble--
C: \ Users \ JdeBP \ - wobble-- -> C: \ Users \ JdeBP \ - wurble--
     1 fichier renommé

C: \ Users \ JdeBP] dir / a: hs / t / m / k --wurble--
11/03/2014 20:29 0 _HSA___________ --wurble--

[C: \ Users \ JdeBP]

Lectures complémentaires

  • Logiciel JP. BOUGEZ . Prenez l'aide de Command / TCC.
  • Logiciel JP. REN . Prenez l'aide de Command / TCC.
JdeBP
la source
Pour ma part, je ne suis pas sur le point d'acheter un logiciel commercial pour faire ce que je devrais être faisable avec un petit programme gratuit (et je pourrais très bien finir par l'écrire moi-même comme d'habitude). Quoi qu'il en soit, vous avez codé en dur les attributs, ce qui n'est pas bon car vous ne pouvez pas prédire quels attributs un dossier peut avoir. De plus, en le touchant, vous avez perdu son horodatage d'origine.
Synetech