kopiuj / przenieś wiele plików przy użyciu cp / mv bez użycia wyrażeń regularnych

9

Załóżmy, że mam folder zawierający niektóre pliki i niektóre foldery (pliki mogą być dowolnego typu). I chcę przenieść / skopiować niektóre z tych plików i folderów za pomocą mv/ cpcommand. Czy jest jakiś sposób, żebym mógł wybrać niektóre z nich losowo, podobnie jak dokonujemy wyboru za pomocą klawisza Ctrl i wykonujemy przenoszenie / kopiowanie za pomocą terminala? Nie mogę używać symboli wieloznacznych ani wyrażeń regularnych, ponieważ chcę wybierać pliki różnych typów, a ich nazwy mają niewielkie podobieństwa.

MikhilMC
źródło
3
Możesz podać więcej informacji. Jakie pliki podobieństwa mają?
Sergiy Kolodyazhnyy
2
Nawet jeśli nie możesz używać wyrażeń regularnych lub symboli wieloznacznych, możesz skorzystać z podobieństwa i nawiasów klamrowych, aby rozwinąć argumenty. Tak czy inaczej, jeśli masz plik1, plik2, plik3, jak w jednej z poniższych odpowiedzi, możesz po prostu użyć cp -t /dest/ file{1,2,3}lub dla zakresów cp -t /dest/ file{1..3}. Działa również w przypadku nieliczbowych argumentów i kombinacji, np . cp -t /dest/ f{ile,ly}.{csv,txt}Wykonuje cp -t /dest/ file.txt file.csv fly.txt fly.csv. Uważaj na nadpisywanie rzeczy, jeśli pozycja jest ważna, ale uważam je za przydatne.
neocpp,
Dlaczego tego potrzebujesz? Dlaczego nie używać menedżera plików zgodnie z opisem? Narzędzia powłoki starają się być mniej dwuznaczne, jak to możliwe.
Braiam
Wszyscy wiemy, że możemy wybierać losowe pliki i foldery w folderze za pomocą klawisza Ctrl. Chcę tylko wiedzieć, czy możemy wdrożyć podobną technikę podczas korzystania z terminalu Linux
MikhilMC

Odpowiedzi:

11

Jeśli chcesz przenieść lub skopiować wszystkie pliki do tego samego katalogu, możesz użyć -topcji cplub mv, ale oznacza to, że musisz wpisać / podać każdą nazwę pliku jako argument. Działa w następujący sposób, z dowolną liczbą plików i argumentów:

cp -t /destination/directory/ file1 file2 file3

lub

mv -t /destination/directory/ file1 file2 file3

Jest to dość pracochłonne, ale wpisywanie nazw plików można ułatwić, korzystając z uzupełniania tabulacji przez Bash .

Alternatywnie poniższy skrypt bash znajdzie wszystkie pliki w katalogu podanym jako pierwszy argument i skopiuje wybrane pliki do katalogu docelowego podanego jako drugi argument.

Sprawdza każdy plik i pyta, czy chcesz go skopiować. Na końcu wyboru pliku wyświetla listę wybranych plików i pyta, czy chcesz je skopiować do katalogu docelowego:

#!/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[@]}"

Ostrzegamy, że w tym skrypcie nie ma błędów sprawdzania, czy istnieje katalog docelowy lub czy wprowadzono poprawne argumenty.

Arroniczny
źródło
4

Oto skrypt, który wybiera losowy zestaw plików / katalogów do skopiowania. Może obsługiwać dowolne nazwy plików, nawet te zawierające znaki nowej linii i spacje. Zapisz skrypt jako ~/bin/randomCopy.sh, ustaw go jako wykonywalny ( chmod a+x ~/bin/randomCopy.sh), a następnie uruchom go, podając katalog źródłowy jako pierwszy argument, katalog docelowy jako drugi i liczbę plików / katalogów (skrypt nie rozróżnia plików i katalogów, zgodnie z prośbą) do skopiowania. Na przykład, aby skopiować 5 losowych plików lub katalogów z /foodo /bar:

randomCopy.sh /foo /bar 5

Scenariusz:

#!/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

Pamiętaj, że spowoduje to zastąpienie istniejących plików, jeśli w katalogu docelowym istnieją pliki o tej samej nazwie.

terdon
źródło
0

Może spróbuj użyć czegoś takiego jak Midnight Commander ? Jest to aplikacja konsolowa, która zapewnia podobne funkcje do graficznego menedżera plików Nautilus.

Tomek
źródło
0

Niedawno znalazłem skuteczne rozwiązanie tego problemu za pomocą xargs.

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

Następnie wpisz Ctrl + C. To na pewno zadziała. Przetestowałem to. Za pomocą tej metody możemy wybierać pliki tak jak za pomocą Ctrlprzycisku w trybie graficznym i kopiować / przenosić / usuwać.

MikhilMC
źródło