すべてのファイルをカレントディレクトリから上位ディレクトリに移動する方法は?
linuxでカレントディレクトリから上位ディレクトリにすべてのファイルを移動させるには?
mv *.*のようなものを試してみましたが、うまくいきません。
linuxでカレントディレクトリから上位ディレクトリにすべてのファイルを移動させるには?
mv *.*のようなものを試してみましたが、うまくいきません。
探しているコマンドは
mv * .[^.]* ..
または (詳細は以下を参照)
(shopt -s dotglob; mv -- * ..)
説明: mv コマンドはファイルとディレクトリを移動します。mvへの最後の引数はターゲット(この場合、ツリーの中で1つ上の「上」のディレクトリ、..)です。それ以前の引数はソースファイルとディレクトリです。アスタリスク (*) はワイルドカードで、ドットで始まらないすべてのファイルにマッチします。ドットで始まるファイル (dotfiles) は「隠された」ファイルです。これらのファイルはパターン .[^.]* を使用してマッチします (下記の編集を参照)。
mv についての詳細はリンク先の man ページを参照してください。
.[^.]*ではなく.*なのか? Chris Johnsen が正しく指摘しているように、パターン .* は . と .. にもマッチします。これらを移動させたくない(できない)ので、ドットで始まるファイル名にマッチするパターンを使う方が良いでしょう(この2つを除く)。パターン .[^.]* はまさにその通りで、ドットで始まるファイル名 (1) の後にドットではない文字 (2) が続く (3) の後に 0 個以上の任意の文字が続くものにマッチします。
Paggas さんが指摘しているように、2つのドットで始まるファイルにマッチさせるためには、パターン.??*を追加する必要があります。find を使った代替案については、彼の回答を参照してください。
Arjanの解答 は、ドットファイルの問題を回避するために shopt に言及しています。しかし、ダッシュで始まるファイルの問題もあります。そして、それには3つのコマンドが必要です。それでも、私はこのアイデアが好きです。私は次のように使うことを提案します。
(shopt -s dotglob; mv -- * ..)
これは、shopt をサブシェルで実行し(そのため、shopt の二回目の呼び出しは不要)、ダッシュで始まるファイルが -- の引数として解釈されないように mv を使用します。
短い答え:
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
を使う 長い答え。
mv * .* ..
コマンドは動作しません。しかし、
mv * .[^.]* ..
というコマンドも、.* は . と .. にはマッチしないので、うまくいきません! 代わりに、私がやっているのは
mv * .[^.] .??* ..
で、これは .[^.]* と ..filename 以外のすべてのものにマッチします。. は .. で始まらない全てのファイル名にマッチし、* は . 以外のドットで始まる 2 文字のファイル名にマッチし、.[^.] はドットで始まる 3 文字以上のファイル名にマッチします。
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
を使用することで、.. の醜いグロブハックを回避することができます。
* を使用した場合、mv には隠しファイルを移動する機能がありません。
cp -rf . ..
rm -rf *
ドットグラブや検索コマンドを使うような複雑な解決策は必要ありません。
rsync -a --remove-source-files . ..
rsync は非常に強力なファイルコピーツールであり、一般的に効率的なインクリメンタルリモートバックアップやミラーを実行するために使用されます。
上記のコマンドでは、rsync の内容を . にコピーするように .. に指示しています。
スイッチ -a は . のサブディレクトリへの再帰を有効にし、その他の一般的なオプションを有効にします。
スイッチ --remove-source-files は、コピーが成功した後にソースファイルを削除するよう rsync に指示します。
この最小化されたコマンドは、ほとんどの最新のシェルで動作します:
\mv -- {,.{[^.],??}}* ..
その他に記載されているものは、ポータブルなソリューションです。
\mv -- * .[^.] .??* ..
特徴:
\ エイリアスがmvを改変するのを防ぎます。
– 先頭のハイフン (-xyz) を含むファイル名がコマンドライン引数として解釈されないようにしました。
.で始まる2文字のファイル名のうち、.を除くすべてのファイル名にマッチします。
Naive Implementations:
1.以下は、隠されたUNIXファイル名、.で始まるファイル名をスキップします。(.bashrc)で始まるファイル名をスキップします。
結局のところ、mv .を試しても失敗します。mv * .. で cwd にあるファイルを移動させることができます。
前者は ksh88 のような古いシェルでも動作するので、* .[!.] .??* よりも * .[^.] .??* のパターンを使用する方が正しいです。
mv -- * .[!.] .??* ..
-- は、-
で始まるファイル名がある場合の問題を防ぐ - * は、.
で始まらないすべてのファイル名にマッチする - .
で始まる 1 文字のファイル名は存在しない - .[!.] で始まる 1 文字のファイル名は存在しない -
を移動させることができる/すべきである . .??* で始まる2つの文字ファイル名すべてにマッチします。ファイル名パターン . は、実際にはファイル名 .[^.] (常に存在する) と .. (おそらく存在しない) にマッチし、望ましい効果とは逆の効果をもたらします。
mv * .??* ../.
* はドットではないファイルを全て取得します。.??* は 3 バイト以上の .ファイルを取得します。残っているものは、rmではなくmvにした方が良いでしょう。
../. は .. に比べて直接的な利点はありませんが、ディレクトリへの移動を行う際には、パスに何か問題があると失敗するため、非常に良い習慣になっています。例えば、mv xyz bletchでは、bletchがディレクトリだと思っていた場合、mv xyz bletch/.を使うことでより確実なものにすることができます。
findとgrepも動作します。このような構造は、find と egrep を変更して、より複雑な条件でファイルを選択したい場合に役立つかもしれません。
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
全てのファイルを親ディレクトリに移動させる最も簡単な方法は、
mv "`ls`" ../
または、隠しファイル/ディレクトリがある場合は
を使用することだと思います。
mv "`ls -a`" ../ 2>/dev/null
また、あるフォルダの内容を内部フォルダの一つである tony(例)に移動させたいとします
を使用します。
mv "`ls -a`" /tony 2>/dev/null
注:
"`ls -a`"
スペースを含むファイルを移動するには、次のようにします。
2>/dev/null
ls -aは.と..のフォルダも表示されてしまい、移動やコピーができないため、警告やエラーを抑制するためのものです。ls -aはlsと0x6&のフォルダも表示してしまい、移動もコピーもできないので、それらのフォルダは移動できないというエラーを表示して、残りのフォルダは快適に移動できるようにします。
隠しファイルがない場合は0x6&を避けて0x6&を使うのがベスト。