How do I create a bash file that creates a symbolic link (linux) for each file moved from Folder A to Folder B [closed]

StackOverflow https://stackoverflow.com/questions/21788630

  •  11-10-2022
  •  | 
  •  

質問

How do I create a bash file that creates a symbolic link (linux) for each file moved from Folder A to Folder B. However, this would be done selecting the 150 biggest current files from Folder A.

役に立ちましたか?

解決

Can probably write it in a one liner, but easier in a simple bash script like

#!/bin/bash
FolderA="/some/folder/to/copy/from/"
FolderB="/some/folder/to/copy/to/"
while read -r size file; do
  mv -iv "$file" "$FolderB"
  ln -s "${FolderB}${file##*/}" "$file"
done < <(find "$FolderA" -maxdepth 1 -type f -printf '%s %p\n'| sort -rn | head -n150)

Note ${file##*/} removes everything before the last /, per

   ${parameter##word}
          Remove matching prefix pattern.  The word is expanded to produce a pattern just as in  pathname  expansion.   If  the
          pattern  matches  the  beginning of the value of parameter, then the result of the expansion is the expanded value of
          parameter with the shortest matching pattern (the ``#'' case) or the  longest  matching  pattern  (the  ``##''  case)
          deleted.   If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and
          the expansion is the resultant list.  If parameter is an array variable subscripted with @ or *, the pattern  removal
          operation is applied to each member of the array in turn, and the expansion is the resultant list.

Also, it may seem like a good idea to just do for file in $(command), but process substitution and while/read works better in general to avoid word-splitting issues like splitting up files with spaces, etc...

他のヒント

As with any task, break it up into smaller pieces, and things will fall into place.

Select the biggest 150 files from FolderA

This can be done with du, sort, and awk, the output of which you stuff into an array:

du -h /path/to/FolderA/* | sort -h | head -n150 | awk '{print $2}'

Move files from FolderA into FolderB

Take the list from the last command, and iterate through it:

for file in ${myarray[@]}; do mv "$file" /path/to/FolderB/; done

Make a symlink to the new location

Again, just iterate through the list:

for file in ${myarray[@]; do ln -s "$file" "/path/to/FolderB/${file/*FolderA\/}"; done
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top