Unixでファイルのみを移動する方法


18

mvコマンドを使用して、Linuxのあるフォルダーから別のフォルダーにプレーンファイルのみ(ディレクトリではなく)を移動するにはどうすればよいですか?

試しましたmv * ~/が、ディレクトリを含むすべてをコピーしました。


コメントには、追加の制限が記載されています。コマンドは、隠しファイルを現在の作業ディレクトリから移動してはいけません。これが正しい場合、質問を編集してこれについて言及してもらえますか?「ファイルのみを移動する」と言うと、「すべてのファイルを移動する」と思われます。これには隠しファイルも含まれます。
いんちきのキホーテ2009年

回答:


29

あなたが試すことができます

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
うわー、findの使い方を知っている人。完全を期すには、検索で-name [^。] *を使用する必要があります。つまり、--- findです。-maxdepth 1 -type f -name [^。] * -exec mv {} path \;
クリス

これをシェルにコピーペーストしないでください。セミコロンにより、すぐに実行されます。:)
シャーウッドキャロウェイ

@SherwoodCallawayセミコロンはの終わりをマークすることです-exec
dstonek

4

私は「すべてにハンマーを使う」男なので、他の人が外部プログラムを使用するものにはボーンシェルプログラムを使用します...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

できるだけ少ないタイピングで物事を成し遂げたい人もいますが、私は非常に速いタイピストであり、このようなものを脳に組み込んでいるので、正確に調べる代わりにこれを行うのはそれほど苦痛ではありませんfindおよびexecなどの引数。

YMMV、しかし...


そのおかげで私はそれを試してみます。しかし、私はLinuxコースでやっているプロジェクトのためにそれが他の答えを必要としています。多くのおかげで

1
これあなたの質問に対する答えです。mvは、ファイルまたはディレクトリ、fifo、またはその他の特殊ファイルを理解していません。mvはディレクトリエントリとiノードのみを認識し、それに関する限り、これらはファイルタイプに関係なくすべて同じです。mvが特定の種類のファイルのみを移動できるようにするには、実際にiノードを調べてファイルが何であるかを確認できるtestやfindなどが必要です。言い換えれば、mv のみでそれを行うように求められている場合、トリックの質問をされています。
クリス

1
そして、私はMVがiノードを理解していると言うだけで、その後、技術的には、RM、ない(RMその後、実際にはLNである)MV CPである別のファイルシステムからファイルを、移動することができるので。ハードリンクとディレクトリエントリを確認します。
クリス

2
shorty:これは良い答えです。mvコマンド以外の何か(少なくともシェル)を使用する必要があります。これはプログラミングなしで取得できる基本的なものです。
カイルブラント

3

@Mereghostは非常に近いです。ディレクトリではなく、すべてのファイル(隠しファイルを含む)を移動すると次のようになります。

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

.検索した後、あなたを想定して、現在のディレクトリは、移動したいファイルのソースです。そうでない場合は、次のようにコマンドを修正できます。

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

隠しファイルではなく、通常のファイルのみを移動する場合:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

通常のファイルではなく、隠しファイルのみを移動する場合:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

名前にドットが含まれるフォルダがない場合は、すべてを簡単に移動できます。

mv 〜/ destinationfolder

(私の仮定は、あなたのファイルはすべてsomething.somethingであることです(私の場合、通常はすべてです))

しかし、他の回答に感謝-非常に有用。THX


-1

あなたは見つけることができます

find * -maxdepth 1 -type f -exec mv {} ~ \;

うまくいきましたが、100%ではなく、すべてのファイルをディレクトリとサブディレクトリから〜/の場所にコピーしました。私は別のディレクトリにあるディレクトリから隠しファイルなしでファイルをコピーする非常に基本的なものが必要です。それでおしまい。とにかくアドバイスをありがとう

それは1とMAXDEPTHでは不可能だ
ジョン・T

隠しファイルをコピーしないように修正されました。
ジョンT

1
findの構文は、find、次にディレクトリ、次に操作の説明と一致するものです。一つは、一般的に、これまで(すなわち見つける/パス/に/ディレクトリ-nameグー*型Fグロブからそれを保護せずに*などのfindなどのワイルドカードを使用することはありません。
クリス・

1
検索は、単一のパスを渡して調べる場合にのみ適切に機能します。たとえば、たとえば、aで始まるファイルがある場合、findは突然爆発します。ディレクトリエントリの読み取りを行うプログラムは1つだけにしておく方がずっと良いでしょう。この例では、2つの異なるプログラム(findとshell)を使用しています。
クリス

-2

mv `find ./sourcedir/* -type f` ./destdir


2
名前に空白が含まれているファイルでは、これは失敗します。ファイル名を出力するコマンドの出力は、適切に区切られていることが保証されない限り、決して解析されるべきではありません。主なアイデアについては、ls(1)の出力を解析しない理由を参照してください。問題を回避するには、find-execオプションを使用するのが最善の方法です。
slhck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.