「mv」の代わりに複数の端末を使用する場合、「切り取り」と「貼り付け」機能

「mv」の代わりに複数の端末を使用する場合、「切り取り」と「貼り付け」機能

異なる作業ディレクトリに2つの端末があり、ファイルを使用せずにある端末のPWDから別の端末のPWDにファイルを移動したい場合mvmvディレクトリの1つ以上を入力する必要があるため)

bashスクリプトで実装すると、非常に単純な「切り取り」と「貼り付け」機能が得られます。

# cut (pseudocode)
fname=<target>
mv <target> /tmp/the-cut-file
# paste
mv /tmp/the-cut-file ./$fname

この機能を処理する標準的なツールがあるかどうか疑問に思います。だから直接ロールアウトする必要はありません(そして極端なケースを処理し、コマンドラインのオートコンプリートを取得する代わりにメンテナンスするなど)。

ベストアンサー1

私はあなたが望むものを正確に実行するツールを知りません。それは存在しないという意味ではありませんが、一般的なLinuxデスクトップでは見つける可能性が低いという意味です。

一般的な歌詞ツールを使用して個々のファイルをコピーして貼り付けます。

正確にコピーして貼り付けるモデルにならないように、要件を少し変更したい場合は、作業が簡単になります。コピー - 切り取り - 貼り付けモデルが実行することの1つは、ソースポイントから切り取りとコピーの決定を行うことです。これにより、実装が複雑になり、ファイルに対して直観に反することがよくあります。ファイルの場合、ソースから選択し、ターゲットからコピーまたは移動する方が適していることがよくあります。このアプローチでは、ソースはファイル名のリストだけをコピーし、移動またはコピーを決定しません。

一般的なツールでは、ファイル名をクリップボードにコピーするのは非常に簡単です。xselまたはxclipX11pbcopypbpastemacOSで。バラよりコンテンツを表示せずにファイルの内容をクリップボードにコピーします。そしてラップすることなく端末から4k以上の入力をどのように読み取ることができますか?xsel通常、デフォルトでxclipはインストールされませんが、パッケージとして提供されることがよくあります。xsel入力に時間がかかり、他のツールも似ているため、例ではこれを使用します。xsel実際、大きな入力には問題がありますが、一般的なファイル名には問題ありません。

次のコード例では、ファイル名が改行文字で終わらないと仮定しています。

zshとxselの場合、単一のファイルまたはディレクトリのコピー/貼り付けの例は次のとおりです。

/some/where% xsel <<<$PWD/myfile
/else/where% cp `xsel` .

bashまたはkshの場合は二重引用符が必要です。

/some/where$ xsel <<<"$PWD/myfile"
/else/where$ cp -p "`xsel`" .

ファイル名にシェル特殊文字が含まれている場合、コマンドラインに直接貼り付けることはできません。

複数ファイルの処理

複数のファイルを処理する最も簡単な方法は、複数のファイルを処理しないことです。複数のファイルをコピーするには、ターゲットターミナルからターゲットディレクトリ(名前)をコピーしてソースターミナルに貼り付けます。

/else/where$ xsel <<<"$PWD"
/some/where$ cp -Rp file1 file2 *.more.files "`xsel`"

cfn(というファイルがあります。オフィFエリーName)はデフォルトで引数を$PWD/クリップボードにコピーしますが、より堅牢性を追加します。複数の引数をサポートし、X選択とクリップボードの両方にコピーし、絶対ファイル名と相対ファイル名の両方で機能し、Windowsでサポートされている次のオプションがあります。道。 null区切り文字を使用するように改善することができ、それはファイル名の改行をサポートします。

#! /bin/sh
# Copy file name

if [ "$#" -eq 0 ] || [ "$1" = "--help" ]; then
  cat <<EOF
Usage: $0 [OPTION]... FILENAME [...]
Copy FILENAME to both the X clipboard and the primary selection.
If FILENAME is relative, prepent \$PWD.
Multiple FILENAMEs are separated by newlines, but no newline is added at the
end.

  -F            Do not add a newline after the last file name (default)
  -f            Do add a newline after the last file name
  -p PREFIX     Prefix to use instead of \$PWD
  -r ROOT       Prefix to use before ROOT
  -s STRING     Separator to use instead of a newline
  -u            Use slash as the path separator (default)
  -w            Use backslash instead of slash as the path separator
EOF
  exit
fi

set -e -f

append=
cwd="$PWD/"
explicit_cwd=
names=
nl='
'
root=
sep='/'

change_separator () {
  if [ -z "$1" ]; then
    eval "$var="
    return
  fi
  IFS=/
  var=$1
  eval "set \$$var; $var=\$1"
  shift
  if [ "$1" != "" ]; then
    set "$@" ""
  fi
  while [ "$#" -ne 0 ]; do
    eval "$var=\$$var\$sep\$1"
    shift
  done
}

while getopts Ffuwp:r:s: OPTLET; do
  case "$OPTLET" in
    F) append=;;
    f) append=1;;
    p) cwd="$OPTARG"; explicit_cwd=1;;
    r) root="$OPTARG";;
    s) nl="$OPTARG";;
    u) sep="/";;
    w) sep="\\";;
    *) echo 1>&2 "$0: unknown option: -$OPTLET"; exit 3;;
  esac
done
shift "$((OPTIND-1))"
if [ -z "$explicit_cwd" ] && [ "$sep" != "/" ]; then
  change_separator cwd
fi

for x do
  case $x in
    .) x=${cwd%"$sep"};;
    [!/]*)
      if [ "$sep" != "/" ]; then
        change_separator x
      fi
      x="$cwd$x";;
    *)
      if [ "$sep" != "/" ]; then
        change_separator x
      fi;;
  esac
  names="$names$root$x$nl"
done
if [ -z "$append" ]; then
  names=${names%"$nl"}
fi
printf %s "$names" | xsel
printf %s "$names" | xsel -b

ここに貼り付けスクリプトはありません。 zshに複数のファイル(改行で区切られた名前)を貼り付ける方法は次のとおりです。

/else/where% cp -p ${(f)$(xsel)} .

バッシュから:

/else/where$ readarray -t a < <(xsel) && cp -p "${a[@]}" .

おすすめ記事