基本的に私はこれをしたい:
mv /path/sourcefolder/* /path/destinationfolder/
ただし、90日より古いファイルにのみ適用されます。
MVは、必要に応じてソースパスのサブディレクトリ構造をコピーする必要があります。 MVは90日を過ぎたファイルのみを移動します。
そのようなことはうまくいきません。ソースサブディレクトリ構造に関係なく、すべてのファイルを同じターゲットフォルダに配置します。
find -type f -mtime +600 -exec mv '{}' /storage/9016-4EF8/WhatsApp/Media/ \;
答え1
を使用すると、zsh
次のことができます。
dest=/storage/9016-4EF8/WhatsApp/Media
cd /path/sourcefolder &&
for f (**/*(ND.m+89)) {
mkdir -p -- $dest/$f:h &&
mv -- $f $dest/$f
}
zmodload zsh/files
.mv
mkdir
またはPOSIXとして:
cd /path/sourcefolder &&
dest=/storage/9016-4EF8/WhatsApp/Media find . -type f -mtime +89 -exec sh -c '
for f do
mkdir -p -- "$dest/${f%/*}" &&
mv -- "$f" "$dest/$f"
done' sh {} +
(注:-mtime -89
89日未満のファイル、-mtime 89
89〜90日間のファイル、90日以上(または少なくとも開始時-mtime +89
)のファイルを選択するには、ここを参照してください。find
空その間隔内にDSTクロックが変更されているかどうかにかかわらず、24時間期間を示します))。
いずれにせよ、mv
外部メディアに元のファイルをコピーするときに元のファイルのほとんどのプロパティを保存しようとしていますが、ディレクトリ自体はデフォルトの所有権、権限、および属性を持つ新しいディレクトリで作成されます(問題になる可能性が低い) Unixに似たファイルシステムでも、ターゲットフォルダの音が悪くなります。
答え2
このスクリプトは、スペースを含むディレクトリ/ファイル名に対して機能します。ここで何が起こるのかは、コマンドを実行するのではなくコマンドを印刷することです。実際にコマンドを実行するには、コードから「echo」という単語を両方の場所から削除します。
Oneliner は、シェル (/bin/sh または /bin/bash) を使用して次を実行します。
DAYS=89; SOURCE="/path/sourcefolder/"; DEST="/path/destinationfolder/"; find "${SOURCE}" -mtime +${DAYS}|while read -r S; do D=$(echo "${S}"|sed "s#^${SOURCE}#${DEST}#g"); DD=$(dirname "${D}"); [ -d "${DD}" ] || echo mkdir -p \"${DD}\"; echo mv -f \"${S}\" \"${D}\"; done
説明する:
# define number of days
DAYS=89;
# source directory
SOURCE="/path/sourcefolder/";
# destination directory
DEST="/path/destinationfolder/";
# take one by one all files from source directory
find "${SOURCE}" -mtime +${DAYS}|while read -r S; do
# create destination file path, based on source file path
D=$(echo "${S}"|sed "s#^${SOURCE}#${DEST}#g");
# find directory, where distination file should be placed
DD=$(dirname "${D}");
# if destination directory does not exist, create it
[ -d "${DD}" ] || echo mkdir -p \"${DD}\";
# move source file to destination
echo mv -f \"${S}\" \"${D}\";
done