检查一个文件是否存在于多个目录中

检查一个文件是否存在于多个目录中

我需要一个脚本来查看目录中的文件并查看它是否存在于多个目录之一中。

我需要这样的东西:

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

这些文件不会位于目录的根目录中。我不能只搜索 /media,因为我不想在 CD-ROM 或视频中搜索。

我正在使用最新版本的 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

相关内容