폴더 경로를 반복하지 않고 다른 폴더에서 명령을 수행하려면 어떻게합니까?


73

동일한 폴더에서 , 그 이후 를 수행하지 않고도 복사 및 이동 작업을 수행하거나 파일을 복제하는 명령을 수행 하는 영리한 방법이 있습니까?cdmv

예를 들어 다음을 실행해야합니다.

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

파일을 이동하는 디렉토리는 동일하지만 전체 경로를 다시 넣어야하며 때로는 성가신 경우가 있습니다. 전체 경로를 다시 넣지 않고 다른 방법이 있는지 알고 싶습니다 . 작업이 같은 경로에서 수행되기 때문입니다.


9
나는 이것이 너무 많은 투표를 믿을 수 없다. 중복 unix.stackexchange.com/questions/35782/…unix.stackexchange.com/questions/66889/…
user13107

13
@ user13107 다른 단어를 포함하여 질문하는 방법에는 여러 가지가 있습니다. 답이 "중괄호 확장"이라는 것을 모르면 바로 찾지 못할 수 있습니다.
slhck

2
@ user13107 다른 사이트에 있으므로 중복되지 않습니다
user151019

1
마크, 고마워요. 중복에 대한 규칙을 몰랐어요. @slhck 예. 이해 했어요. Unix.SE에 대한 질문이 중복되어 닫히고 인기가 높아서 좌절했습니다.
user13107

3
@ user13107, 이것이 바로 올바른 사이트에 게시 할 수있는 것입니다
Samuel Edwin Ward

답변:


125

간단하게 괄호 확장을 사용하십시오 .

mv /folder1/folder2/folder3/{file.txt,file-2013.txt}

이것은 다음과 같이 쓰는 것과 같습니다.

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

중괄호 확장은 물론 더 많은 논증을 제공 할 수 있습니다. 범위를 전달할 수도 있습니다. 예를 들어, 몇 개의 테스트 폴더를 생성하고, 실행할 수 있으며 mkdir test_{a..z}, Bash 4부터 시작하여 , 및 touch foo{0001..3}을 생성하는 foo0001에서 foo0002와 같이 0으로 채워진 시퀀스를 생성 할 수 있습니다 foo0003. 강타 해커 위키는 당신을 위해 몇 가지 예에 기사를 가지고있다.

두 개의 다른 명령을 사용해야하는 cd경우 @ Ignacio 's answer에서같이 먼저 서브 쉘을 사용하십시오 .


5
나는 brace확장 에 대해 몰랐어요 , 감사합니다!
Valter Silva

시도했지만 작동하지 않는 것 같습니다.meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
Valter Silva

5
에서 /bin/bash와 같이 Bash를 사용 /bin/sh하고 있고 shebang 또는 중괄호 확장을 지원하지 않는 다른 쉘 에있는 스크립트 에 있지 않습니까? 당신이 실행하는 경우 set, 당신의 SHELLOPTS포함 braceexpand합니까?
slhck

22
file.txt,와 사이에 공백이 없어야합니다 file2.txt.
slhck

9
변경되지 않는 부분의 오타를 방지하기 위해 더 짧게 만들 수 있습니다.mv /folder1/folder2/folder3/file{,-2013}.txt
Jan Fabry

74

서브 쉘에서 조작을 실행하십시오.

( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )

작업 디렉토리의 변경 사항은 상위 쉘로 전파되지 않습니다.


11
+1 : 내가 좋아하는 하나의 중괄호 확장 트릭보다 더 많은 휴대용에서 쉘 (깔끔한하지만, 덜 휴대용 인)
올리비에 Dulac

@Olivier, 괄호 확장이 이식성이 아니라고 생각하는 이유는 무엇입니까? 어떤 쉘을 지원하지 않는가?
Alexis

5
@alexis Brace 확장은 POSIX에 의해 지정되지 않았으므로 "디자인에 따라"이식성이 없습니다. ash, dash, ksh88오래된 Bourne 쉘이 그것을 지원하지 않는 쉘의 예입니다 언급 할 필요가 없을 것입니다.
jlliagre

@jlliagre 언급 한 쉘 중 POSIX와 완전히 호환되는 것은 무엇입니까? 즉, POSIX 인 경우에도 중괄호 확장이 없을 것입니다. ksh88은 POSIX가 비준되기 전이었습니다. ksh93 이상으로 업그레이드해야합니다. 리눅스에서 관심을 가질만한 두 사람은 작은 임베디드 배포판 (busybox, iirc?)과 복구 디스크에 사용되기 때문에 애쉬와 대시입니다.
Kaz

2
@Kaz 나는 쉘 명령의 이식성과 그것들이 대화식인지 또는 중요하지 않다는 사실에 관심이있다. 물론, 당신은 이것에 대해 신경 쓰지 않고 자유롭지 만 사람들이 다른 생각을한다는 것을 인정하십시오. barce-expansion을 지원하는 bash 또는 쉘을 항상 사용한다는 것이 모든 사람의 경우를 의미하지는 않습니다.
jlliagre

21

영리한 것을 원한다면 여기 배쉬 히스토리 확장

mv /folder1/folder2/folder3/file.txt !#:1:h/file-2013.txt

암기하는 것이 불가능하기 때문에 나는 이것을 직접 사용하지 않을 것입니다. 나는 종종 vim equivalent을 사용 하지만 거의 매번 찾아야합니다.


11

변수를 설정할 수 있습니다. 물론 이것은 주변에 변수를 남기는 부작용이 있습니다.

D=/folder1/folder2/folder3; mv $D/file.txt $D/file-2013.txt

물론, 전체 명령 행을 서브 쉘 (D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt)에 넣거나 unset, 끝에 명령을 추가 하여 변수를 남겨 두는 부작용을 피할 수 있습니다 . 따옴표를“모범 사례”로 추가했습니다. 항상 따옴표를 사용하는 습관을들이는 경우 특수 문자가 포함 된 경로 이름이 올 때 머리를 멈출 필요가 없습니다.
Scott

@Scott 부작용을 제거하기 위해 서브 쉘을 사용하려는 cd경우 변수를 설정하는 것보다 쉽습니다 . 훨씬 쉽지 는 않습니다 .
Isaac Rabinovitch

2

나는 다른 솔루션을 좋아하지만 여기에 bash 배열을 사용하여 스크립트로 구현하고 푸시하고 팝 한 다른 솔루션이 있습니다.

#!/bin/bash
set -e
# from http://stackoverflow.com/a/246128/178651
script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# paths relative to the script
relative_paths=( \
path1 \
path2 \
path3 \
path4
)

for relative_path in "${relative_paths[@]}"
do
  pushd "$script_path/$relative_path" > /dev/null 2>&1
  pwd
  mv filename1 filename2
  # could do other stuff in this directory...
  popd > /dev/null 2>&1
done

pushd "$script_path" > /dev/null 2>&1
# could do other stuff in same directory as script...
popd > /dev/null 2>&1

1

Slhck은 가장 간단한 방법으로 질문에 직접 답변하지만 Valter는 자동 팝업 답변도 좋아하므로 다음과 같은 내용이 있습니다.

pushd /folder1/folder2/folder3/; mv file.txt file-2013.txt; popd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.