Bash 스크립트에서 "cp" 사용 [닫기]

Bash 스크립트에서 "cp" 사용 [닫기]

이 스크립트가 작동하지 않는 이유는 무엇입니까? 항상 스크립트가 있는 기본 디렉터리를 엽니다. 새 디렉터리를 열 수는 없습니다.

#!/bin/bash

read -p "choose a directory: " map
list=$( ls )
for item in $list; do
    echo $item
    read -p "Make copy? " ans

    if [ $ans = "yes" ]; then        
        cp $item > mkdir $map+copy
    fi
done
echo "Done"

답변1

cp $item > mkdir $map+copy

>좋습니다 . 명령의 출력, 즉 인쇄되는 부분을 (보통 터미널로) 리디렉션합니다. 예를 들어 ls파일 목록이 출력되므로 ls > list.txt목록이 출력됩니다 list.txt. 그러나 예를 들어 터미널에 아무것도 출력하지 않고 명시 적으로 cp foo bar파일을 열 수 있습니다 .foobar

따라서 여기서 리디렉션은 이라는 빈 파일을 제공 mkdir하지만 명령의 나머지 부분은 확장되는 항목 ( 변수의 내용과 고정 문자열이 함께 연결됨) 에 cp $list $map+copy이름이 지정된 파일을 복사합니다 .$list$map+copy$map+copy

반면에, cat foo그러면 foo그것을 열고 인쇄할 수 있으며, cat foo > bar해당 인쇄물을 이라는 파일로 보낼 수 있습니다 bar. 실제로는 이 작업을 수행하는 것과 거의 동일합니다. 단, 해당 항목에 좋아요를 표시 하고 소유자 및 권한 정보를 복사할 수 있다는 cp foo bar점만 다릅니다. .cp-a-p

또한 셸에서는 사이에 공백 없이 문자열을 나란히 배치하여 문자열을 연결할 수 있습니다. 따라서 변수를 설정하면 x=foo y=bar이 모든 내용이 인쇄됩니다 foobar.

echo foobar
echo "foo""bar"
echo "$x$y"
echo "foo$y"
echo "${x}bar"

이는 "${map}copy"두 부분을 "$map""copy"연결할 수 있음을 의미합니다.

mkdir하지만 별도로 실행 해야 하므로 cp, $map포함 foobar$itemis 인 경우 hello.txt디렉터리가 생성되고 여기에 foobarcopy복사 됩니다.hello.txt

mkdir -p "${map}copy"
cp "$item" "${map}copy"

( 디렉토리가 이미 존재하면 오류가 발생하지 않도록 -p지시합니다 mkdir.)

바라보다:

질문에 대한. (아님) 큰따옴표로 묶인 변수.


또한 다음 대신에:

list=$( ls )
for item in $list; do

다음을 호출하지 않고 쉘이 파일 이름 목록을 생성하도록 할 수 있습니다 ls.

for item in ./*; do

바라보다:

관련 정보