내 작업을 도와주세요:
각각 6개의 파일이 포함된 세 개의 하위 폴더가 있는 폴더가 있습니다. 각 하위 폴더에는 이름에 :nopm이 포함된 두 개의 파일이 있습니다.
모든 폴더와 해당 하위 폴더를 확인하려면 셸 스크립트를 만들어야 합니다. 이름에 :nopm이 포함된 파일 이름이 있으면 이름에서 이(:nopm)를 제거해야 합니다. :nopmremoved에 표시된 것처럼 동일한 이름을 가진 다른 파일이 존재하는 경우 해당 파일을 제거해야 하며 각 상호 작용은 log.txt라는 파일에 기록되어야 합니다.
예를 들어:
나는 디렉터리를 가지고 있습니다: example_September
이 디렉터리에는 세 개의 하위 디렉터리가 있습니다.
fruit/
car/
vegetable/
이 세 디렉터리에는 각각 6개의 파일이 있습니다.
fruit : apple pear banana melon grape :nopmlime
car : fiat mercedes ferrari audi suzuki :nopmaudi
vegetables : bean broccoli cabbage corn carrot :nopmgarlic
In the directory fruit the script should rename :nopmlime to lime
In the directory car the script should delete :nopmaudi
모든 이름 변경 및 삭제는 .txt 파일에 기록되어야 합니다. 예:
I remove the file(s)
I rename the file(s)
이것이 내가 임무를 완수하는 방법이다. 이 문제를 해결하는 데 도움을 주실 수 있나요?
for if find /data/irm/Example_September -name :nopm:
do mv filename1 filename2
echo I rename the file.
elif
rm file
echo I remove the file.
fi >> /data/irm/Example_September/log.txt \;
답변1
스크립트 주석의 지침:
# assign log file name into variable
log_file_name=script.log
# iterate over all files in this folder an its subfolders
for fname in $(find . -type f)
do
# check if current file name contains ":nopm" substring
there_is_match=$(echo $(basename $fname) | grep ':nopm' | wc -l)
# if yes value "1" will be assigned into there_is_match variable
if [ $there_is_match -eq 1 ] ; then
# cut off ":nopm" substring - I use perl instead of sed because I find its regex nicer then sed's
newname=$(echo $fname | perl -p -e 's/:nopm//g')
# check if file without substring already exists
if [ -e $newname ] ; then
# if yes delete it and log it
rm -f $newname
echo "Deleted file $newname" >> $log_file_name
fi
# rename file and log it
mv $fname $newname
echo "Renamed file $fname to $newname" >> $log_file_name
fi
done
[ ]
괄호는 test
bash 명령의 단축키 라는 점을 기억하세요 . 숫자, 문자열을 비교하고 파일 및 디렉터리의 특정 조건을 확인할 수 있습니다.