Bash에서 첫 번째 코드를 작성하고 있습니다. 2시간 동안 갇혀 있었어요. 이것은 내 코드입니다.
#!/bin/bash
declare -i l=0
declare -i d=0
declare -i s1=0
declare -i s2=0
declare -i t=0
declare -i o=0
declare -i p=0
for i in demo_room/subject_1/?*
do
if [ "${i:0:1}" = "l" ];
then
((l++));
echo "l=$l"
python motempl_n.py $i $l
elif [ "${i:0:1}" = "d" ];
then
((d++));
echo "d=$d"
python motempl_n.py $i $d
elif [ "${i:0:1}" = "o" ];
then
o=$((o+1));
echo "o=$o"
python motempl_n.py $i $o
elif [ "${i:0:1}" = "p" ];
then
p=$((p+1));
python motempl_n.py $i $p
elif [ "${i:0:1}" = "t" ];
then
t=$((t+1));
python motempl_n.py $i $t
elif [ "${i:0:7}" = "slide_1" ];
then
s1=$((s1+1));
python motempl_n.py $i $s1
#elif [ "${i:0:7}" == 'slide_2' ]
else
s2=$((s2+1));
python motempl_n.py $i $s2
fi
done
그래서 폴더가 있습니다 demo_room/subject_1
. 이 폴더에는 140개의 avi 비디오가 있으며 이름은 다음과 같습니다.
20개 동영상의 dislike_01
이름은 다음과 같습니다.dislike_20
20개 동영상의 like_01
이름은 다음과 같습니다.like_20
20개 동영상의 ok_01
이름은 다음과 같습니다.ok_20
20개 동영상의 point_01
이름은 다음과 같습니다.point_20
20개 동영상의 slide_1_01
이름은 다음과 같습니다.slide_1_20
20개 동영상의 slide_2_01
이름은 다음과 같습니다.slide_2_20
20개 동영상의 take_a_picture_01
이름은 다음과 같습니다.take_a_picture_1_20
내가 하고 싶은 것은 먼저 입력 비디오의 클래스를 찾은 다음 Python 파일에 대한 입력으로 표시되도록 하는 것입니다. 폴더의 처음 20개 비디오 subject_1
는 dislike
1개이므로 이 코드는 제대로 작동하지만 21번째 비디오는 작동 like_01
하지만 Python 코드에 전달하는 매개변수는 21입니다.
하지만 이는 for 루프에서 유사한 클래스의 첫 번째 비디오이므로 1이어야 합니다. 매번 값을 인쇄합니다 $d
. 이는 매번 2nd 를 입력한다는 의미입니다 if condition
. Python 코드에서 동영상 이름이 이고 like_01
전달된 두 번째 값이 임을 확인할 수 있습니다 21
. 왜? 이는 140개 동영상 모두에서 발생합니다.
답변1
귀하의 경로 $i
에는 전체 경로( demo_room/subject_1/file
)가 포함되므로 항상 로 시작됩니다 d
.
다음을 수행할 수 있습니다.
case "${i##*/}" in
(d*) ...;;
(l*) ...;;
(slide1_*) ...;;
...
esac
${i##*/}
$i
일치하는 위치의 앞부분을 제거했습니다 */
.
또한 sh/bash에는 인용 매개변수 확장이 필요합니다.
python motempl_n.py "$i" "$s2"
답변2
코드가 잘 작성되었음에도 불구하고 여전히 중복되는 부분이 많습니다. 보다 간소화된 버전은 다음과 같습니다.
#!/bin/bash
declare -A count
for file in demo_room/subject_1/*; do
base=${file##*/}
case $base in
slide_[12]*) key=${base:0:7};;
[ldopt]*) key=${base:0:1};;
*) ;; # other types ignored
esac
(( count[$key]++ ))
echo "$key=${count[$key]}"
python motempl_n.py "$file" "${count[$key]}"
done
나는 다른 정수 변수 대신 연관 배열을 사용했지만 운 좋게도 bash 산술은 이를 (( an_unset_variable++ ))
우아하게 처리하고 변수에 "1"을 할당합니다.
파일 이름에는 항상 하나 이상의 문자가 포함되어 있으므로 일치하는 문자(0개 이상의 문자)가 없고 일치하는 파일(1개 이상의 문자)이 없기 때문에 ?
귀하의 이름 은 중복됩니다.?*
*
?*
답변3
변수 $i
는 항상 d
:으로 시작하며 demo_room … …
파일 이름을 추출해야 합니다. 추출 중이므로 파일의 이름과 번호도 추출할 수 있습니다.
따라서 스크립트의 더 짧은 버전은 다음과 같습니다.
#!/bin/bash
declare -Ai count
for i in ./demo_room/subject_1/?*; do
j=${i##*/} ; name=${j%_*} ; number=${j##*_}
((count[$name]++))
echo \
python motempl_n.py "$i" "${count[$name]}"
done
echo "List of keys: " "${!count[@]}"
스크립트는 배열 변수만 사용하며 count
, (에서) 사용된 (자동) 키 목록은 $name
스크립트 끝에 인쇄됩니다.
echo \
스크립트가 실제로 명령을 실행하는 방식이 마음에 들면 해당 줄을 주석 처리하세요.