두 폴더를 비교하고 쉘 스크립트를 사용하여 차이점을 세 번째 폴더에 복사하는 방법

두 폴더를 비교하고 쉘 스크립트를 사용하여 차이점을 세 번째 폴더에 복사하는 방법
#!/bin/sh
# This is comment!
echo Hello World
for file1 in /C:/Users/shubham.tomar/Desktop/Shell/Test1/*; 
do
filename1=$(basename "$file1")
echo $filename1
echo "------------------------"
for file2 in /C:/Users/shubham.tomar/Desktop/Shell/Test2/*;
do
filename2=$(basename "$file2")
echo $filename2
if [["filename1" = "filename2"]]; then
echo "---File matched---"
else
mv -f /C:/Users/shubham.tomar/Desktop/Shell/Test2/$filename2 /C:/Users/shubham.tomar/Desktop/Shell/Moved/
fi
echo "--------------File Moved-----------"
done
done

**

질문에 대한 참고 사항

**

예: Desktop/Test1 및 Downloads/Test2의 특정 경로에 일부 파일이 있습니다. Test2에는 있지만 Test1에는 없는 모든 파일을 예: Documents/MovedFiles의 경로로 이동하는 쉘 스크립트를 작성하고 싶습니다. 파일은 다음과 같을 수 있습니다. 어떤 유형이든

답변1

sf() {
    # find all files in the directory $1 non-recursively and sort them
    find $1 -maxdepth 1 -type f printf '%f\n' | sort
}

그런 다음 실행

join -v 1 <(sf Tes2) <(sf Tes1) | xargs -d '\n' -I file mv Tes2/file MovedFiles/

파이프의 왼쪽 피연산자는 Tes2디렉토리에 존재하지 않는 모든 파일을 찾습니다 Tes1.

그런 다음 파이프의 오른쪽 피연산자는 이러한 파일을 디렉터리로 이동합니다 MovedFiles.

답변2

중첩된 for 루프를 사용하는 것은 잘못되었습니다. Test1의 모든 파일 이름을 비교 하고 싶지는 않습니다 Test2.

편집: 디버깅 및 file 사용 방지를 위한 몇 가지 추가 스크립트 라인 *.

#!/bin/sh

# Check if this is correct
dir1="/C:/Users/shubham.tomar/Desktop/Shell/Test1"
# maybe you have to write
# dir1="/c/Users/shubham.tomar/Desktop/Shell/Test1"
dir2="/C:/Users/shubham.tomar/Desktop/Shell/Test2"
targetdir="/C:/Users/shubham.tomar/Desktop/Shell/Moved"

# for debugging
echo contents of dir1 $dir1
ls "$dir1"
echo contents of dir2 $dir2
ls "$dir2"

# loop over all files in $dir2 because you want to find files in $dir2 that are not in $dir1
for file2 in "$dir2"/*
do
    # if $dir2 does not exist or is empty we will get something like file2="/C:/Users/shubham.tomar/Desktop/Shell/Test2/*" 
    # That's why check if the file exists
    if [ -f "$file2" ]
    then
        filename2=$(basename "$file2")
        echo $filename2
        echo "------------------------"

        # does a file with the same basename exist in $dir1?
        if [ ! -f "$dir1/$filename2" ]
        then
            # using "$targetdir"/." makes sure you get an error if $targetdir is a file instead of a directory
            mv -f "$file2" "$targetdir"/.
            echo "--------------File Moved-----------"
        else
            echo "file with the same name exists in $dir1"
        fi
    fi
done

실제로 파일을 이동하지 않고 먼저 이 작업을 시도하려면 다음 줄을 바꾸면 됩니다.

        mv -f "$file2" "$targetdir"/.

그리고

        echo mv -f "$file2" "$targetdir"/.

관련 정보