名前が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は検索されません。
参照:
ワイルドカード ウィンドウの下。
ワンライナーでエコーを使用してテストするには(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 "\\........$"
これはバッチで可能ですが、PowerShellでは簡単です。
ls | foreach { if (($_.BaseName.Length -eq 5) -and ($_.Extension -eq ".txt"))
{ $_.CopyTo("\Name\Of\Target\Folder\" + $_.Name) }
ファイル名を正規表現と照合して行うこともできますが、この方法は問題なく機能します。
バッチでは、次のようなことができます。
@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
別のバッチアプローチは次のとおりです。
@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番目の文字が.txt
、foo
、t
の場合、変数x
の値は.
になります。 、およびt
であり、10番目の文字はありません。