정규식을 사용하지 않고 cp / mv를 사용하여 여러 파일 복사 / 이동


9

일부 파일과 일부 폴더가 들어있는 폴더가 있다고 가정하십시오 (파일은 모든 유형 일 수 있음). mv/ cp명령을 사용하여 해당 파일 및 폴더 중 일부를 이동 / 복사하고 싶습니다 . Ctrl 키를 사용하여 선택하고 터미널을 사용하여 이동 / 복사하는 것처럼 임의의 것을 임의로 선택할 수있는 방법이 있습니까? 다른 유형의 파일을 선택하고 와일드 카드 나 정규식을 사용할 수 없으며 파일 이름이 유사하지 않습니다.


3
더 많은 정보를 제공 할 수 있습니다. 어떤 종류의 유사성 파일이 있습니까?
Sergiy Kolodyazhnyy

2
정규식이나 와일드 카드를 사용할 수없는 경우에도 유사성과 중괄호를 사용하여 인수를 확장 할 수 있습니다. bash에서 아래 답변 중 하나와 같이 file1, file2, file3이있는 경우 cp -t /dest/ file{1,2,3}또는 ranges 만 사용할 수 있습니다 cp -t /dest/ file{1..3}. 숫자가 아닌 인수 및 조합에도 적용됩니다 (예 : cp -t /dest/ f{ile,ly}.{csv,txt}executes) cp -t /dest/ file.txt file.csv fly.txt fly.csv. 위치가 중요하면 물건을 덮어 쓰는 데주의를 기울이십시오.하지만 유용합니다.
neocpp

왜 이것이 필요한가요? 설명 할 때 파일 관리자를 사용하지 않는 이유는 무엇입니까? 쉘 도구는 가능한 모호하지 않도록 노력합니다.
Braiam

우리는 Ctrl 키를 사용하여 폴더 아래에서 임의의 파일과 폴더를 선택할 수 있다는 것을 알고 있습니다. Linux 터미널을 사용하는 동안 비슷한 기술을 구현할 수 있는지 알고 싶습니다.
MikhilMC

답변:


11

모든 파일을 동일한 디렉토리로 이동하거나 복사하려면 또는 -t옵션을 사용할 수 있지만 이는 각 파일 이름을 인수로 입력 / 제공해야한다는 의미입니다. 다음과 같은 방식으로 작동하며 원하는만큼 많은 파일을 인수로 사용합니다.cpmv

cp -t /destination/directory/ file1 file2 file3

또는

mv -t /destination/directory/ file1 file2 file3

이것은 매우 힘들지만 Bash의 탭 완성을 사용하면 파일 이름을 쉽게 입력 할 수 있습니다 .

또는 다음 bash 스크립트는 첫 번째 인수로 지정된 디렉토리의 모든 파일을 찾고 두 번째 인수로 지정된 대상 디렉토리로 선택한 파일을 복사합니다.

각 파일을 확인하고 해당 파일을 복사 할 것인지 묻습니다. 파일 선택이 끝나면 선택한 파일 목록이 표시되고 파일을 대상 디렉토리에 복사할지 묻습니다.

#!/bin/bash
directory=$1
destination=$2
selected_files=()
for f in ${directory}/*
do
  if [[ -f $f ]]
  then
    while true
    do
      read -p "Would you like to copy ${f}? y/n: " choice
      case $choice in
        y|Y) selected_files+=("$f");
             break ;;
        n|N) echo "${f} will not be copied.";
             break ;;
        *) echo "Invalid choice, enter y/n: " ;;
      esac
    done
  fi
done
echo "The following files will be copied to ${destination}."
for file in "${selected_files[@]}"
do
  echo "$file"
done
while true
do
  read -p "Are these the correct files? y/n: " confirm
  case $confirm in
    y|Y) break ;;
    n|N) echo "Exiting filechooser"; exit 1 ;;
    *) echo "Invalid choice, enter y/n: " ;;
  esac
done
cp -t "$destination" "${selected_files[@]}"

이 스크립트에는 대상 디렉토리가 있는지 또는 올바른 인수를 입력했는지에 대한 오류 점검이 없음을 경고하십시오.


4

다음은 복사 할 임의의 파일 / 디렉토리 세트를 선택하는 스크립트입니다. 줄 바꿈과 공백이 포함 된 파일조차도 임의의 파일 이름을 처리 할 수 ​​있습니다. 스크립트를로 저장하고 ~/bin/randomCopy.sh실행 파일 ( chmod a+x ~/bin/randomCopy.sh)로 만든 다음 실행하여 소스 디렉토리를 첫 번째 인수로, 대상 디렉토리를 두 ​​번째로, 파일 / 디렉토리 수를 지정하십시오 (스크립트는 파일과 디렉토리를 구분하지 않습니다, 요청하신대로) 복사하십시오. 예를 들어, 임의의 파일 또는 디렉토리를 5 개에서 다음으로 복사 /foo하려면 /bar다음 을 수행하십시오 .

randomCopy.sh /foo /bar 5

스크립트 :

#!/bin/bash

if [ $# -lt 3 ]; then
        cat<<EOF 
This script needs at least 3 arguments: the source directory, the
target directory and the number of files/dirs to be copied. For example:

    $0 /from /to 5

EOF
        exit
fi 

sourceDir="$1"
targetDir="$2"
number="$3"

## Collect all file and directory names. The globstar
## bash option lets ** match all files and directories
## recursively
shopt -s globstar
dirsAndFiles=( ** )

## Get $num random numbers from 0 until
## the number of files and dirs found. This
## will let us take a random selection.
limit=$((${#dirsAndFiles[@]}-1))  
numbers=$(shuf -i 0-"$limit" -n "$number")

for num in $numbers; do
    cp -rv "${dirsAndFiles[$num]}" "$targetDir"
done

동일한 파일 이름을 가진 파일이 대상 디렉토리에있는 경우 기존 파일을 덮어 씁니다.


0

아마도 Midnight Commander 같은 것을 사용해보십시오 . 그래픽 노틸러스 파일 관리자와 유사한 기능을 제공하는 콘솔 응용 프로그램입니다.


0

최근에 xargs를 사용 하여이 문제에 대한 효과적인 해결책을 찾았습니다.

`xargs cp
 file1
 file2
 .....
 .....
 <path of the destination folder>`

그런 다음을 입력하십시오 Ctrl + C. 이것은 확실히 작동합니다. 나는 그것을 테스트했습니다. 이 방법으로 Ctrl그래픽 모드에서 버튼을 사용하는 것처럼 파일을 선택 하고 복사 / 이동 / 제거를 수행 할 수 있습니다.

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