web-dev-qa-db-ja.com

コマンドライン(CMD)で特定の文字数のファイル名をコピーする

名前が5文字の1つのフォルダーにすべてのテキストファイルをコピーする必要があります。私はこのコマンドがリスト用であることを知っています:

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

しかし、上記のコマンドで名前がリストされているすべてのファイルを別のフォルダーにコピーしたいと思います。

私は(自分だけでなく)「それは簡単に機能しませんか...」と尋ねていました。

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

G-Manのおかげで、inpowershellで動作する、その間cmd.exe上記のコマンドは、最大5文字で、.txtで始まるすべての拡張子を持つ各一致をコピーします。

疑問符(?)

名前の1文字の代わりに疑問符を使用します。たとえば、gloss?.docと入力すると、Glossy.docまたはGloss1.docファイルは検索されますが、Glossary.docは検索されません。

参照:

5
Hastur

ワンライナーでエコーを使用してテストするには(dirコマンドに/sを追加すると、サブフォルダーで機能するはずです)

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

ワンライナーコピーコマンド

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

バッチファイル

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

編集

/a-dスキャンファイル
/adスキャンフォルダー
/a[d|-d]がないと、両方がスキャンされます。詳細については、dir /?を参照してください。

コマンド「dir」に"?????.txt"を追加した場合、スキャンの範囲が縮小され、スキャンにかかる時間が短縮されます。コマンド「dir」でスキャンの範囲をいつでも拡張できますが、最も重要なのはコマンド「findstr」のパターンです。

フォルダ名をスキャンできるように、"^.....\.txt""\\.....\.txt$"に変更しました。

.   Wildcard: any character
ˆ   Line position: beginning of line
$    Line position: end of line
\.  Escape: literal use of metacharacter .

詳細については、findstr /?を参照してください。

なぜそれが機能しないのですか?普遍的な解決策がないため、ケースに合わせてコマンドを調整する必要があります。/sなしで/ bを使用すると、dirコマンドは末尾にスラッシュ\を付けずに出力を生成するため、\\を含むfindstrパターンは失敗します。

これは失敗dir /b "*.txt"|findstr /R "\\........$"
これがいつになるか成功dir /b "*.txt"|findstr /R "^........$"

検索パターンWordが末尾のスラッシュで区切られた行の終わりにあるときに出力を生成するdirコマンドの場合と同様に、失敗します。

これは失敗dir /b /s "*.txt"|findstr /R "^........$"
しかし、これは成功dir /b /s "*.txt"|findstr /R "\\........$"

2
Paul

これはバッチで可能ですが、PowerShellでは簡単です。

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

ファイル名を正規表現と照合して行うこともできますが、この方法は問題なく機能します。

2
CBHacking

バッチでは、次のようなことができます。

@Echo OFF

Set "targetDir=C:\Dir"

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

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

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

    )
)

Pause&Exit /B 0
2
ElektroStudios

別のバッチアプローチは次のとおりです。

@echo off 
 setlocal enabledelayedexpansion 
 for %% f in(* .txt)do(
 set foo = %% f 
 set foo =!foo:〜 5,5!
 if!foo!==。txt(
 (このファイル名(%% f)パターンに一致 ?????。txt;あなたがそれでやりたいことをしてください。)
)
)

!foo:~5,5!は、!variable:~offset:length!部分文字列メカニズムのインスタンスです。 6番目の文字(オフセット5)で始まり、長さが5のファイル名の部分文字列を抽出します(.txtに加えて1文字以上をキャプチャするのに十分です)。したがって、ファイル名の6番目、7番目、8番目、および9番目の文字が.txtfootの場合、変数xの値は.になります。 、およびtであり、10番目の文字はありません。