異なる作業ディレクトリに2つの端末があり、ファイルを使用せずにある端末のPWDから別の端末のPWDにファイルを移動したい場合mv
(mv
ディレクトリの1つ以上を入力する必要があるため)
bashスクリプトで実装すると、非常に単純な「切り取り」と「貼り付け」機能が得られます。
# cut (pseudocode)
fname=<target>
mv <target> /tmp/the-cut-file
# paste
mv /tmp/the-cut-file ./$fname
この機能を処理する標準的なツールがあるかどうか疑問に思います。だから直接ロールアウトする必要はありません(そして極端なケースを処理し、コマンドラインのオートコンプリートを取得する代わりにメンテナンスするなど)。
答え1
私はあなたが望むものを正確に実行するツールを知りません。それは存在しないという意味ではありませんが、一般的なLinuxデスクトップでは見つける可能性が低いという意味です。
一般的な歌詞ツールを使用して個々のファイルをコピーして貼り付けます。
正確にコピーして貼り付けるモデルにならないように、要件を少し変更したい場合は、作業が簡単になります。コピー - 切り取り - 貼り付けモデルが実行することの1つは、ソースポイントから切り取りとコピーの決定を行うことです。これにより、実装が複雑になり、ファイルに対して直観に反することがよくあります。ファイルの場合、ソースから選択し、ターゲットからコピーまたは移動する方が適していることがよくあります。このアプローチでは、ソースはファイル名のリストだけをコピーし、移動またはコピーを決定しません。
一般的なツールでは、ファイル名をクリップボードにコピーするのは非常に簡単です。xsel
またはxclip
X11pbcopy
とpbpaste
macOSで。バラよりコンテンツを表示せずにファイルの内容をクリップボードにコピーします。そしてラップすることなく端末から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[@]}" .