Using find and mv syntax

I have the following script working currently. The only thing I want to add is to somehow tell the script to find the files using the find and maxdepth variables and then move the files to a corresponding file structure.

example:
file test.txt exists in the /data/user1/upload directory
The script moves the file test.txt to a new filename (appends date/time)
The script also copies the file to /test/archive directory
I want the script to then move the file to the --parents /test directory

Something like:

find . -maxdepth 7 -type f ! -name "*.*" | xargs mv -p --parents -t /test \+

Am I on the right track?

Or can I add a line outside of the script to the .sh and have it do this after?

Working script:

thetime=`date +%Y-%m-%d_%H:%M:%S` #
for i in *.*
do
    [[ "$i" =~ \.filepart$ ]] && continue
        extn=${i##*.} # save the extension of the file
                mv "$i" "${i%.*}"$(date "+_%Y-%m-%d_%H:%M:%S.${extn}")
        cp -p "$i" "${i%.*}"$(date "+_%Y-%m-%d_%H:%M:%S.${extn}") /test/archive
done

Welcome to the forum.

Some comments:

  • not sure I understand your find ... | xargs syntax. You seem to exclude files with dots in their names? And, the -p and --parent options to the mv command are unknown to me, as is the meaning of the \+ at the end.
  • what be the meaning of defining the thetime variable upfront if you then don't use it (running the risk of cp ing / mv ing to two different file names)?
  • Are you aware that your cp operation has no source file to work upon?
  • what be the sense of extracting the "extension" if - with your find command above - you operate on non-dotted files only?

This script looks at all files in a directory. If the extension has .filepart (partial upload) it skips that file. It appends the date/time to the original filename while maintaining the original extension.

Is there a command I can run that will search all subdirectories for any files and then move the files it finds to a new root location and maintain the same directory tree as the original path?

Example:

/data/user1/upload/test.txt

new location

/test/user1/upload/test.txt

something like find and then move
Thanks for the quick reply.

You should have a look at the rsync command, these paramters are of particular interest to you is:

-a recurse sub-folders and preserve permissions/owners
--backup to backup existing files in destination folder before they are replaced with a new version
--suffix to use date as the backup suffix
--exclude=PATTERN to exclude .filepart files
--remove-source-files to remove the source files after copying
-v verbose output
--dry-run just list what will be done without doing anything.

Here is a command the should be close to what you are after:

rsync -a -v --dry-run --exclude="*.filepart" --remove-source-files --backup --suffix _${thetime} /data /test

Remove --dry-run if you are happy with what will happen.

Note that --remove-source-files will only remove files and does not remove any directories so it can leave you with a number of empty directories in the source after it's done.

Only files that are different in source and destination (eg timestamp or contents) are copied, but --remove-source-files will still clean them up.

Files will only be renamed by --backup if they already exist in destination folder (i.e the 2nd time they are copied).

Remember to make a backup of your files before playing with this script!

Perfect! Thanks!