![파일 이름을 기반으로 파일을 다른 여러 파일에 복사할 수 있는 명령이 Linux에 있습니까? [폐쇄]](https://linux55.com/image/144326/%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%8B%A4%EB%A5%B8%20%EC%97%AC%EB%9F%AC%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EB%B3%B5%EC%82%AC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8A%94%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20Linux%EC%97%90%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
a_b_c_d.jpg
, , , 등의 파일에 복사하여 각 파일이 원본의 복사본이 되도록 하는 Linux 명령이 있습니까 ?a.jpg
b.jpg
c.jpg
d.jpg
원래 이름에서 이름을 추출해야 하며, 첫 번째로 구분되고 _
첫 번째로 끝나야 합니다 .
.
답변1
#!/bin/sh
for name in *_*.jpg; do
# Only care about regular files
[ ! -f "$name" ] && continue
# Do the following in a subshell to avoid affecting the original
# environment with "set -f" and setting IFS
(
set -f # Turn off filename globbing (allows filename to contain e.g. *)
IFS='_' # Split unquoted strings on "_" only
# Split the filename into parts (remove trailing ".jpg" first), and then
# iterate over the parts, creating the symbolic links
for part in ${name%.jpg}; do
ln -s -- "$name" "$part.jpg"
# To do copying instead, use:
# cp -i -- "$name" "$part.jpg"
done
)
done
.jpg
스크립트는 하나 이상의 밑줄을 포함하고 현재 디렉터리에서 끝나는 모든 파일 이름을 반복합니다 . 이러한 각 이름에 대해 이름을 밑줄로 분할하고 생성합니다.심볼릭 링크이름 부분을 분할( .jpg
파일 이름 접미사 추가)하여 원본 파일(사본 아님)로 만듭니다.
나는 원본 파일의 실제 복사본이 아닌 심볼릭 링크를 생성하기로 결정했는데, 이는 추가 디스크 공간을 많이 차지하지 않기 때문입니다. 정말로 복사하고 싶다면 스크립트 주석에서 해당 코드를 찾을 수 있습니다.
두 파일이 모두 포함된 디렉터리에서 이를 실행하면 다음이 a_b_c_d.jpg
생성됩니다.ABBA_hello there_misc.jpg
.
|-- ABBA.jpg -> ABBA_hello there_misc.jpg
|-- ABBA_hello there_misc.jpg
|-- a.jpg -> a_b_c_d.jpg
|-- a_b_c_d.jpg
|-- b.jpg -> a_b_c_d.jpg
|-- c.jpg -> a_b_c_d.jpg
|-- d.jpg -> a_b_c_d.jpg
|-- hello there.jpg -> ABBA_hello there_misc.jpg
`-- misc.jpg -> ABBA_hello there_misc.jpg
답변2
다음과 같이 보일 수 있습니다:
for FN in *.jpg; do IFS="_."; AR=($FN); for i in "${AR[@]}"; do [ ! "$i" = "jpg" ] && echo cp "$FN" "$i".jpg; done; done
cp a_b_c_d.jpg a.jpg
cp a_b_c_d.jpg b.jpg
cp a_b_c_d.jpg c.jpg
cp a_b_c_d.jpg d.jpg
더 많은 오류 검사, IFS 보호 장치를 추가하고 echo
만족스러우면 제거하는 등의 작업을 수행할 수 있습니다.
편집하다Kusalananda의 의견을 바탕으로 편집되었습니다.
for FN in *.jpg; do IFS="_"; for i in ${FN%.jpg}; do echo cp "$FN" "$i".jpg; done; done
답변3
간단한 방법은...
for x in a b c d
do
cp a_b_c_d.jpg $x.jpg
done
a b c d
해당 부분을 지정하지 않고 파일 이름에서 가져오는 좀 더 프로그래밍적인 방식으로 이 작업을 수행하고 싶다고 추측할 수 있습니다 .
이 경우 파일 이름을 가져와서 두 번 분할해야 합니다. 먼저 .
의 발생을 기준으로 파일 확장자를 가져온 다음 다시 의 _
발생을 기준으로 파일 이름을 가져와야 합니다. 이 작업은 다음을 사용하여 수행할 수 있습니다.IFS그리고 위의 원래 예에서 했던 것처럼 파일 이름 배열에 대한 루프를 수행합니다.
답변4
음, 간단한 스크립트를 작성했습니다
#!/bin/bash
for filename in *_*.jpg; do
n=$(echo "$filename" | awk -F '_' '{print NF}')
for ((i=1; i<$n;i++)) ;do
cp "$filename" "$(echo "$filename" | awk -F '_' '{print '"\$$i"'}')".jpg
done
cp "$filename" "$(echo "$filename" | awk -F '_' '{print '"\$$n"'}')"
done
jpg
하나 이상의 .dll이 있는 파일을 검색한 _
다음 cp "$filename" "$(echo "$filename" | awk -F '_' '{print '"\$$i"'}')".jpg
이를 사용하여 원본 파일을 복사합니다. 하지만 마지막 매개변수에는 .jpg
확장자가 포함되어 있으므로 .expansion 없이 for 루프 외부에 별도로 작성했습니다 .jpg
.