複数のディレクトリにファイルがあることを確認する

複数のディレクトリにファイルがあることを確認する

ディレクトリ内のファイルを表示し、そのファイルが複数のディレクトリのいずれかに存在することを確認するには、スクリプトが必要です。

次のようなものが必要です。

for files in /downloads/ #may or may not be in a sub-directory
do
   print if file exists in /media/tv, /media/movie, or /media/music
done

これらのファイルはディレクトリルートにありません。 CD-ROMやビデオを検索したくないため、/mediaだけを検索することはできません。

最新バージョンのUbuntuサーバーを使用しています。

答え1

ファイルを保存する必要があるか(重複ファイルを削除する必要がありますか?)、ハードリンクする必要があるかどうか、その他のことに言及していません。

したがって、意図に応じて最善の解決策は、次のプログラムを使用することです。探す(非対話型)、レプリカ(よりインタラクティブで維持するファイルを選択できます)プリン(重複ファイルのみが報告されています)または他の多くのファイル。

ポイントアンドクリックインターフェースで何を維持するかを選択できるGUIでさらに進化した機能が必要な場合は、フォスリント(コマンドを通じてfslint-gui)推奨される選択になります。

上記のすべてのものはDebianのリポジトリにあり、移行を通じてUbuntuまたはLinux Mintのリポジトリ(使用している場合)にあると想定しています。

答え2

/downloads各ファイル名を繰り返すと、非常に遅くなる可能性があります/media。したがって、各階層を一度繰り返し、ファイル名のリストを保存してリストを処理するだけです。

簡単にするために、ファイル名に改行文字が含まれていないとします。

find /downloads -type f | sed 's!^.*/\(.*\)$!\1/&!' |
  sort -t / -k1,1 >/tmp/downloads.find
find /media/tv /media/music /media/movie -type f |
  sed 's!^.*/\(.*\)$!\1/&!' |
  sort -t / -k1,1 >/tmp/media.find

この時点で、両方のファイル.findには、ファイル名の前にファイル名順に並べられたファイルパスのリストが含まれています。最初の区切りフィールドでファイルをリンク/し、結果を少しクリーンアップします。

join -j 1 -t / /tmp/downloads.find /tmp/media.find |
  sed -e 's![^/]*/!!' -e 's![^/]*/! has the same name as !'

答え3

以下は、bashで中括弧拡張を使用した実装です。

the_file=foo.mp3
for file in /downloads/media/{tv,movie,music}/"$the_file"; do 
   if [[ -e $file ]]; then
      printf '%s found in %s:\n' "$the_file" "${file%/*}"
   fi
done

答え4

echo "Enter file name"
read file
flag=0

for i in 'ls'
do
  if [ $i == $file ] ;then
    echo "File exist"
    flag=1
    break;
  fi
done

if [ $flag == 0 ] ;then
  echo "File not exist"
fi

関連情報