디렉터리의 파일을 보고 해당 파일이 여러 디렉터리 중 하나에 존재하는지 확인하려면 스크립트가 필요합니다.
다음과 같은 것이 필요합니다.
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