mv가 존재하지 않는 경우 이동할 디렉토리를 생성하도록 하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/547719

  •  23-08-2019
  •  | 
  •  

문제

따라서 홈 디렉터리에 있고 foo.c를 ~/bar/baz/foo.c로 옮기고 싶지만 해당 디렉터리가 존재하지 않는 경우 해당 디렉터리를 자동으로 생성할 수 있는 방법이 있습니까? 당신은 입력하기 만하면됩니다

mv foo.c ~/bar/baz/ 

그러면 모든 일이 잘 풀릴까요?해당 디렉토리가 존재하는지 확인하고 그렇지 않은 경우 mkdir을 호출한 다음 mv를 호출하는 간단한 bash 스크립트에 mv의 별칭을 붙일 수 있는 것처럼 보이지만 더 나은 아이디어가 있는 사람이 있는지 확인해야 한다고 생각했습니다.

도움이 되었습니까?

해결책

이 1 라이너 (배쉬)는 어떻습니까 :

mkdir --parents ./some/path/; mv yourfile.txt $_

그것을 분해 :

mkdir --parents ./some/path

디렉토리 (모든 중간 디렉토리 포함)를 생성 한 후 : 다음 :

mv yourfile.txt $_

파일을 해당 디렉토리로 이동합니다 ($ _는 이전 쉘 명령, 즉 새로 생성 된 디렉토리로 전달 된 마지막 인수로 확장).

나는 이것이 다른 껍질에서 얼마나 멀리 작동할지 잘 모르겠지만, 무엇을 찾아야하는지에 대한 아이디어를 줄 수 있습니다.

다음은이 기술을 사용하는 예입니다.

$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt

다른 팁

mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt

mv 또는 mv.sh라는 스크립트로 저장

#!/bin/bash
# mv.sh
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"

또는 모든 새 터미널에서 기본 mv를 대체하는 함수로 ~/.bashrc 파일 끝에 넣습니다.함수를 사용하면 bash가 매번 스크립트 파일을 읽는 대신 메모리를 유지할 수 있습니다.

function mv ()
{
    dir="$2"
    tmp="$2"; tmp="${tmp: -1}"
    [ "$tmp" != "/" ] && dir="$(dirname "$2")"
    [ -a "$dir" ] ||
    mkdir -p "$dir" &&
    mv "$@"
}

이는 Chris Lutz의 제출을 ​​기반으로 합니다.

당신이 사용할 수있는 mkdir:

mkdir -p ~/bar/baz/ && \
mv foo.c ~/bar/baz/

자동으로 수행 할 간단한 스크립트 (테스트되지 않은) :

#!/bin/sh

# Grab the last argument (argument number $#)    
eval LAST_ARG=\$$#

# Strip the filename (if it exists) from the destination, getting the directory
DIR_NAME=`echo $2 | sed -e 's_/[^/]*$__'`

# Move to the directory, making the directory if necessary
mkdir -p "$DIR_NAME" || exit
mv "$@"

대답이 아니오 인 것 같습니다 :). 나는 종종 일회성이기 때문에이 작업을 수행하기 위해 별명이나 func를 만들고 싶지 않습니다. mv 명령, 그러나 나는 그것에 대해 잘 작동하는 것을 발견했습니다.

mv *.sh  shell_files/also_with_subdir/ || mkdir -p $_

만약에 mv 실패 (dir가 존재하지 않음), 디렉토리를 만들 것입니다 (이전 명령에 대한 마지막 인수입니다. $_ 그것을 가지고 있습니다). 그러므로이 명령을 실행하십시오 위로 이번에는 그것을 다시 실행합니다 mv 성공해야합니다.

아마도 다음 쉘 스크립트?

#!/bin/sh
if [[ -e $1 ]]
then
  if [[ ! -d $2 ]]
  then
    mkdir --parents $2
  fi
fi
mv $1 $2

그것이 기본 부분입니다. 인수를 확인하기 위해 약간 추가 할 수 있으며 대상이 존재하거나 소스 디렉토리가 존재하거나 존재하지 않으면 동작이 변경되기를 원할 수 있습니다 (즉, 존재하지 않는 것을 덮어 쓰지 않음). .

가장 간단한 방법은 다음과 같습니다.

 mkdir [directorie name] && mv [filename] $_

다운로드 Directorie (~/download)에있는 PDF 파일을 다운로드했다고 가정 해 봅시다. 그 다음에 종료되지 않는 Directorie에서 모든 것을 옮기고 싶습니다 ( "my_pdf" ).
다음 명령을 입력하겠습니다 (내 현재 Working Directorie가 ~/다운로드인지 확인) :

mkdir my_PDF && mv *.pdf $_

다음과 같이 하위 디렉토리를 만들려면 mkdir에 -p 옵션을 추가 할 수 있습니다. ( "Python"이라는 하위 디렉터를 만들고 싶다고 가정) : :
mkdir -p my_PDF/python && mv *.pdf $_

Sillier이지만 작업 방식 :

mkdir -p $2
rmdir $2
mv $1 $2

대상 파일 이름을 공유하는 임시 디렉토리를 포함하여 mkdir -p로 디렉토리를 만든 다음 간단한 rmdir로 해당 파일 이름 디렉토리를 제거한 다음 파일을 새 대상으로 이동하십시오. 나는 더 나인을 사용하는 대답이 아마도 최고라고 생각합니다.

브레이스 확장을 사용할 수도 있습니다.

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}      
  • 3 개의 디렉토리 (directory1, directory2, directory3),
    • 그리고 그들 각각에서 두 개의 하위 디렉터 (subdirectory1, subdirectory2),
      • 그리고 그들 각각에서 두 개의 하위 하위 디렉토리 (subsubdirectory1 및 subsubdirectory2).

Bash 3.0 이상을 사용해야합니다.

rsync 명령은 트릭을 수행 할 수 있습니다 마지막 디렉토리 인 경우에만 대상 경로에는 존재하지 않습니다. ~/bar/baz/ 만약에 bar 존재하지만 baz 그렇지 않으면 다음 명령을 사용할 수 있습니다.

rsync -av --remove-source-files foo.c ~/bar/baz/

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity
--remove-source-files   sender removes synchronized files (non-dir)

이 경우 baz 디렉토리가 존재하지 않으면 디렉토리가 생성됩니다. 그러나 둘 다 bar 그리고 baz 존재하지 마십시오 rsync는 실패합니다.

sending incremental file list
rsync: mkdir "/root/bar/baz" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]

따라서 기본적으로 사용하는 것이 안전해야합니다 rsync -av --remove-source-files 별칭으로 mv.

$what=/path/to/file;
$dest=/dest/path;

mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"

내 하나의 문자열 솔루션 :

test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/

암호:

if [[ -e $1 && ! -e $2 ]]; then
   mkdir --parents --verbose -- "$(dirname -- "$2")"
fi
mv --verbose -- "$1" "$2"

예시:

인수 : "D1" "D2/Sub"

mkdir: created directory 'd2'
renamed 'd1' -> 'd2/sub'

명령을 체인 할 수 있습니다.mkdir ~/bar/baz | mv foo.c ~/bar/baz/
또는 쉘 스크립트는 여기에 있습니다.

#!/bin/bash
mkdir $2 | mv $1 $2

1. 열기 모든 텍스트 편집기
2. 사본-페이스트 쉘 스크립트.
3. 저장 그대로 mkdir_mv.sh
4. 입력하십시오 스크립트 디렉토리 : cd your/script/directory
5. 파일 모드를 변경합니다 : chmod +x mkdir_mv.sh
6. 설정 별명: alias mv="./mkdir_mv.sh"
이제 명령을 실행할 때마다 mv 이동 디렉토리는 존재하지 않으면 생성됩니다.

((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top