5 votes

Copiez les noms de fichiers avec un certain nombre de caractères en ligne de commande (CMD)

Je dois copier tous les fichiers texte dans un dossier dont les noms ont cinq caractères. Je sais que cette commande est pour la liste:

$ dir dossier /B | findstr /R "^.....\.txt"

mais je veux copier tous les fichiers dont les noms sont listés par la commande ci-dessus dans un dossier différent.

5voto

Hastur Points 17791

J'ai demandé (pas seulement à moi-même) "ça ne fonctionne pas un simple..."?

copy  C:\ORIG_DIR\?????.txt C:\Dest_Dir

Merci à G-Man, il est prouvé que dans powershell ça fonctionne, pendant qu'avec cmd.exe la commande ci-dessus copiera chaque correspondance jusqu'à cinq caractères et avec toutes les extensions qui commencent par .txt.

Point d'interrogation (?)

Utilisez le point d'interrogation comme substitut pour un seul caractère dans un nom. Par exemple, si vous tapez gloss?.doc, vous localiserez le fichier Glossy.doc ou Gloss1.doc mais pas Glossary.doc.

Référence:

2voto

CBHacking Points 5749

C'est possible en Batch mais c'est facile en PowerShell.

ls | foreach { if (($_.BaseName.Length -eq 5) -and ($_.Extension -eq ".txt")) 
    { $_.CopyTo("\Name\Of\Target\Folder\" + $_.Name) }

Vous pourriez également le faire en vérifiant les noms de fichier par rapport à une expression régulière, mais cette méthode fonctionne bien.

2voto

ElektroStudios Points 1502

En Batch, vous pourriez faire quelque chose comme ceci :

@Echo OFF

Set "targetDir=C:\Dir"

For %%# In ("*.txt") DO (

    (Echo "%%~nx#" | findstr /R "^......\.")1>Nul 2>&1 && (

        Echo Copie de "%%~nx#" ...
        (Copy /Y "%%~f#" "%targetDir%\%%~nx#")1>NUL

    )
)

Pause&Exit /B 0

2voto

Paul Points 188

Pour tester avec echo en une seule ligne (cela devrait fonctionner avec un sous-dossier si vous ajoutez /s dans la commande dir)

for /f "delims=" %a in ('dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"') do @echo %~fa

Commande de copie en une ligne

for /f "delims=" %a in (
'dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"'
) do @copy  "%~fa" "destination-dir"

Fichier batch

for /f "delims=" %%a in (
  'dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"'
) do (
  copy  "%%~fa" "destination-dir"
)

Modifier:

/a-d scanne des fichiers
/ad scanne des dossiers
Sans /a[d|-d] cela scannera les deux voir dir /? pour plus d'informations

Si j'ai ajouté "?????.txt" dans la commande "dir" c'est pour réduire la portée du scan et donc réduire le temps de scan. Vous pouvez toujours étendre la portée du scan dans la commande "dir" mais le plus important est le motif dans la commande "findstr"

J'ai changé "^.....\.txt" en "\\.....\.txt$" pour être capable de scanner le nom du dossier.

.   Jocker : n'importe quel caractère
ˆ   Position de la ligne : début de la ligne
$    Position de la ligne : fin de la ligne
\.  Échappement : utilisation littérale du méta-caractère .

Voir findstr /? pour plus d'informations

Pourquoi cela ne fonctionne-t-il pas dans certains cas ? Parce qu'il n'y a pas de solution universelle, vous devez adapter la commande à votre cas. Si vous utilisez /b sans /s la commande dir produira une sortie sans barre oblique finale \ donc le motif findstr avec \\ échouera.

Ceci va échouer : dir /b "*.txt"|findstr /R "\\........$"
Alors que ceci va réussir : dir /b "*.txt"|findstr /R "^........$"

De même qu'avec une commande dir qui produit une sortie lorsque le mot du motif de recherche est à la fin de la ligne séparé par une barre oblique finale échouera également.

Comme ceci va échouer : dir /b /s "*.txt"|findstr /R "^........$"
mais ceci va réussir : dir /b /s "*.txt"|findstr /R "\\........$"

1voto

Voici une autre approche par lot:

@echo off
setlocal enabledelayedexpansion
for %%f in (\*.txt) do (
      set foo=%%f
      set foo=!foo:~5,5!
      if !foo!==.txt (
            _(Ce nom de fichier (_%%f_) correspond au motif_ ?????.txt_; faites ce que vous voulez avec lui)._
      )
)

Le !foo:~5,5! est une instance du mécanisme de sous-chaîne !_variable_:~_offset_:_length_!; il extrait la sous-chaîne du nom de fichier à partir du 6ème caractère (décalage 5) et avec une longueur de 5 (suffisante pour capturer .txt plus un caractère de plus, s'il y en a un).  Ainsi, la variable foo a la valeur .txt si les 6ème, 7ème, 8ème et 9ème caractères du nom de fichier sont ., t, x et t, et s'il n'y a pas de 10ème caractère.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X