#!/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"/.