ファイルのリストが存在するかどうかをテストするにはどうすればよいですか?
-
02-07-2019 - |
質問
ファイル名がリストされているファイルがあり、それぞれが独自の行にあり、それぞれが特定のディレクトリに存在するかどうかをテストしたい。たとえば、ファイルのいくつかのサンプル行は次のようになります
mshta.dll
foobar.dll
somethingelse.dll
興味のあるディレクトリは X:\ Windows \ System32 \
であるため、次のファイルが存在するかどうかを確認します。
X:\Windows\System32\mshta.dll
X:\Windows\System32\foobar.dll
X:\Windows\System32\somethingelse.dll
Windowsコマンドプロンプトを使用してこれを行うにはどうすればよいですか?また、(好奇心から)bashまたは別のUnixシェルを使用してこれをどのように行いますか?
解決
cmd.exeでは、 FOR / F% 変数 IN( ファイル名 )DO コマンドは、必要なものを提供するはずです。これは、 filename (および複数のファイル名)の内容を一度に1行ずつ読み取り、その行を%variableに配置します(多かれ少なかれ、コマンドプロンプトでHELP FORを実行します)。誰もコマンドスクリプトを提供しない場合、私は試みます。
編集:要求を行うcmd.exeスクリプトの私の試み:
@echo off
rem first arg is the file containing filenames
rem second arg is the target directory
FOR /F %%f IN (%1) DO IF EXIST %2\%%f ECHO %%f exists in %2
注、上記のスクリプトは スクリプトでなければなりません。 .cmdファイルまたは.batファイルのFORループは、何らかの奇妙な理由で、変数の前に二重のパーセント記号が必要です。
今、bash | ash | dash | sh | kshで動作するスクリプトの場合:
filename="${1:-please specify filename containing filenames}"
directory="${2:-please specify directory to check}
for fn in `cat "$filename"`
do
[ -f "$directory"/"$fn" ] && echo "$fn" exists in "$directory"
done
他のヒント
バッシュ:
while read f; do
[ -f "$f" ] && echo "$f" exists
done < file.txt
for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)
Windowsの場合:
type file.txt >NUL 2>NUL
if ERRORLEVEL 1 then echo "file doesn't exist"
(これは最善の方法ではないかもしれません;私が知っている方法です; http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx )
Bashの場合:
if ( test -e file.txt ); then echo "file exists"; fi
ただし、Win32と* nixの両方でデフォルトのファイルシステムを使用すると、操作の原子性を保証する方法がないことに注意してください。つまり、ファイルA、B、Cの存在をチェックする場合、プロセスまたはスレッドは、ファイルAを渡した後、BとCを探している間にファイルAを削除した可能性があります。
トランザクションNTFS などのファイルシステムはこれを克服できます制限。
上記のソリューションのほとんどに1つの小さなコメントを追加したかった。特定のファイルが存在するかどうかを実際にテストしていません。彼らはファイルが存在し、アクセスできるかどうかを確認しています。ファイルが許可されていないディレクトリに存在することは完全に可能です。その場合、ファイルは存在していても表示できません。