Kopieren / Verschieben mehrerer Dateien mit cp / mv ohne Verwendung regulärer Ausdrücke

9

Angenommen, ich habe einen Ordner mit einigen Dateien und einigen Ordnern (Dateien können von jedem Typ sein). Und ich möchte einige dieser Dateien und Ordner mit dem Befehl mv/ verschieben / kopieren cp. Gibt es eine Möglichkeit, einige davon zufällig auszuwählen, genau wie wir sie mit der Strg-Taste auswählen und mit dem Terminal verschieben / kopieren? Ich kann weder Platzhalter noch den regulären Ausdruck verwenden, da ich Dateien unterschiedlichen Typs auswählen möchte und deren Namen nur geringe Ähnlichkeiten aufweisen.

MikhilMC
quelle
3
Möglicherweise möchten Sie weitere Informationen bereitstellen. Welche Ähnlichkeitsdateien haben?
Sergiy Kolodyazhnyy
2
Selbst wenn Sie keine regulären Ausdrücke oder Platzhalter verwenden können, können Sie Ähnlichkeiten und geschweifte Klammern nutzen, um Argumente zu erweitern. In bash können Sie sowieso, wenn Sie Datei1, Datei2, Datei3 wie in einer der folgenden Antworten haben, nur cp -t /dest/ file{1,2,3}oder für Bereiche verwenden cp -t /dest/ file{1..3}. Es funktioniert auch für nicht numerische Argumente und Kombinationen, z . B. für cp -t /dest/ f{ile,ly}.{csv,txt}Ausführungen cp -t /dest/ file.txt file.csv fly.txt fly.csv. Seien Sie vorsichtig beim Überschreiben von Dingen, wenn die Position wichtig ist, aber ich finde sie nützlich.
Neocpp
Warum brauchst du das? Warum nicht den von Ihnen beschriebenen Dateimanager verwenden? Die Shell-Tools versuchen, so wenig mehrdeutig wie möglich zu sein.
Braiam
Wir alle wissen, dass wir mit der Strg-Taste zufällige Dateien und Ordner unter einem Ordner auswählen können. Ich möchte nur wissen, ob wir eine ähnliche Technik implementieren können, während wir das Linux-Terminal verwenden
MikhilMC

Antworten:

11

Wenn Sie alle Dateien in dasselbe Verzeichnis verschieben oder kopieren möchten, können Sie die -tOption cpoder verwenden mv. Dies bedeutet jedoch, dass Sie jeden Dateinamen als Argument eingeben / angeben müssen. Es funktioniert folgendermaßen mit so vielen Dateien wie Argumenten, wie Sie möchten:

cp -t /destination/directory/ file1 file2 file3

oder

mv -t /destination/directory/ file1 file2 file3

Dies ist ziemlich mühsam, aber das Eingeben der Dateinamen kann durch die Vervollständigung der Registerkarte von Bash vereinfacht werden .

Alternativ findet das folgende Bash-Skript alle Dateien in einem Verzeichnis, das als erstes Argument angegeben wurde, und kopiert die ausgewählten Dateien in das Zielverzeichnis, das als zweites Argument angegeben wird.

Es überprüft jede Datei und fragt, ob Sie diese Datei kopieren möchten. Am Ende der Dateiauswahl wird eine Liste der ausgewählten Dateien angezeigt und Sie werden gefragt, ob Sie sie in das Zielverzeichnis kopieren möchten:

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

Seien Sie gewarnt, dass in diesem Skript keine Fehlerprüfung erfolgt, ob das Zielverzeichnis vorhanden ist oder ob Sie die richtigen Argumente eingegeben haben.

Arronisch
quelle
4

Hier ist ein Skript, das einen zufälligen Satz von Dateien / Verzeichnissen auswählt, die kopiert werden sollen. Es kann mit beliebigen Dateinamen umgehen, auch mit Zeilenumbrüchen und Leerzeichen. Speichern Sie das Skript unter ~/bin/randomCopy.sh, machen Sie es ausführbar ( chmod a+x ~/bin/randomCopy.sh) und führen Sie es dann aus. Geben Sie dabei das Quellverzeichnis als erstes Argument, das Zielverzeichnis als zweites und die Anzahl der Dateien / Verzeichnisse an (das Skript unterscheidet nicht zwischen Dateien und Verzeichnissen). wie von Ihnen angefordert) kopiert werden. So kopieren Sie beispielsweise 5 zufällige Dateien oder Verzeichnisse von /foonach /bar:

randomCopy.sh /foo /bar 5

Das Skript:

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

Beachten Sie, dass dadurch vorhandene Dateien überschrieben werden, wenn im Zielverzeichnis Dateien mit demselben Dateinamen vorhanden sind.

Terdon
quelle
0

Vielleicht versuchen Sie es mit so etwas wie Midnight Commander ? Es ist eine Konsolenanwendung, die ähnliche Funktionen wie der grafische Nautilus-Dateimanager bietet.

Tom
quelle
0

Kürzlich habe ich mit xargs eine effektive Lösung für dieses Problem gefunden.

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

Geben Sie dann ein Ctrl + C. Dies wird sicher funktionieren. Ich habe es getestet. Mit dieser Methode können wir Dateien wie mit der CtrlSchaltfläche im Grafikmodus auswählen und kopieren / verschieben / entfernen.

MikhilMC
quelle